Started migrating to python3

This commit is contained in:
Sebastian 2023-07-12 19:44:08 +02:00
parent 6439a0d974
commit 58e4dbc484
12 changed files with 428 additions and 415 deletions

3
.style.yapf Normal file
View File

@ -0,0 +1,3 @@
[style]
based_on_style = pep8
column_limit=100

View File

@ -1,7 +1,8 @@
# Django settings for past3d project.
from django.core.urlresolvers import reverse_lazy
from django.urls import reverse_lazy
import os
BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../')
DEBUG = True
@ -15,12 +16,14 @@ MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'ENGINE':
'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': os.path.join(BASE_DIR, "data.sqlite"), # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': '',
'PASSWORD': '',
'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'HOST':
'', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
}
}

View File

@ -1,31 +1,19 @@
from django.conf.urls import patterns, include, url
from django.urls import include, re_path, path
from django.conf import settings
from django.conf.urls.static import static
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
from views import HomeView
from past3d.views import HomeView
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'past3d.views.home', name='home'),
# url(r'^past3d/', include('past3d.foo.urls')),
url(r'^$', HomeView.as_view(), name='home'),
url(r'^users/', include('users.urls')),
url(r'^3d/', include('pastebin.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
urlpatterns = [
re_path(r'^$', HomeView.as_view(), name='home'),
path('users/', include('users.urls')),
path('3d/', include('pastebin.urls')),
path('admin/', admin.site.urls),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -2,9 +2,11 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from models import Geometry
from pastebin.models import Geometry
class GeometryAdmin(admin.ModelAdmin):
list_display = ['name', 'description', 'date', 'file', 'sourcefile']
admin.site.register(Geometry, GeometryAdmin)

View File

@ -5,7 +5,7 @@ import struct
from django.forms import ModelForm
from django import forms
from models import Geometry
from pastebin.models import Geometry
facet_pattern = re.compile(r'facet normal\s+[0-9.e+-]+\s+[0-9.e+-]+\s+[0-9.e+-]+')
loop_pattern = re.compile(r'outer\s+loop')
@ -14,7 +14,9 @@ endloop_pattern = re.compile(r'endloop')
endfacet_pattern = re.compile(r'endfacet')
endsolid_pattern = re.compile(r'endsolid .*')
class STLUploadForm(ModelForm):
def clean_file(self):
stlfile = self.cleaned_data.get("file")
@ -74,6 +76,7 @@ class STLUploadForm(ModelForm):
class GeometryForm(STLUploadForm):
class Meta:
model = Geometry
fields = ['name', 'description', 'public', 'expiration', 'file', 'sourcefile']
@ -81,7 +84,7 @@ class GeometryForm(STLUploadForm):
class AnonymousGeometryForm(STLUploadForm):
expiration = forms.ChoiceField(choices=Geometry.EXPIRATION_CHOICES[:-1])
class Meta:
model = Geometry
fields = ['name', 'description', 'public', 'expiration', 'file']

View File

@ -5,12 +5,13 @@ import re
from hashlib import md5
from datetime import datetime, timedelta
from django.core.urlresolvers import reverse
from django.urls import reverse
from django.contrib.auth.models import User
from django.db import models
vertex_pattern = re.compile(r'vertex\s+([0-9.e+-]+)\s+([0-9.e+-]+)\s+([0-9.e+-]+)')
def safe_upload_path(base_dir):
def generate_path(instance, filename):
@ -18,9 +19,7 @@ def safe_upload_path(base_dir):
ext = os.path.splitext(filename)[1]
md5sum = md5()
md5sum.update(instance.name
+ str(datetime.now())
+ filename)
md5sum.update(instance.name + str(datetime.now()) + filename)
randomname = md5sum.hexdigest()
return os.path.join(base_dir, '%s%s' % (randomname, ext))
@ -28,7 +27,6 @@ def safe_upload_path(base_dir):
return generate_path
class Geometry(models.Model):
HOUR = 0
@ -37,20 +35,19 @@ class Geometry(models.Model):
MONTH = 3
FORERVER = 4
EXPIRATION_CHOICES = ((HOUR, 'one hour'),
(DAY, 'one day'),
(WEEK, 'one week'),
(MONTH, 'one month'),
(FORERVER, 'forever'))
EXPIRATION_CHOICES = ((HOUR, 'one hour'), (DAY, 'one day'), (WEEK, 'one week'),
(MONTH, 'one month'), (FORERVER, 'forever'))
DELTAS = { HOUR : timedelta(hours = 1),
DELTAS = {
HOUR: timedelta(hours=1),
DAY: timedelta(days=1),
WEEK: timedelta(weeks=1),
MONTH : timedelta(weeks = 4)}
MONTH: timedelta(weeks=4)
}
name = models.CharField(max_length=128)
description = models.TextField(blank=True)
user = models.ForeignKey(User, blank=True, null=True)
user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True)
expiration = models.IntegerField(default=0, choices=EXPIRATION_CHOICES)
public = models.BooleanField(default=True)
@ -75,9 +72,8 @@ class Geometry(models.Model):
return None
def _generate_meta_infos(self):
print "Generating metainfos %s" % self.name
print("Generating metainfos %s" % self.name)
self.file.open()
@ -86,7 +82,7 @@ class Geometry(models.Model):
max_coord = [None, None, None]
if self.file.read(5) != "solid":
print "binary"
print("binary")
# Skip header
self.file.seek(80)
count = struct.unpack("i", self.file.read(4))[0]
@ -101,12 +97,12 @@ class Geometry(models.Model):
for i in range(0, 3):
x = struct.unpack("<f", self.file.read(4))[0]
if min_coord[i] != None :
if min_coord[i] is not None:
min_coord[i] = min(min_coord[i], x)
else:
min_coord[i] = x
if max_coord[i] != None :
if max_coord[i] is not None:
max_coord[i] = max(max_coord[i], x)
else:
max_coord[i] = x
@ -114,7 +110,7 @@ class Geometry(models.Model):
self.file.seek(self.file.tell() + 2)
else:
print "ascii"
print("ascii")
line = self.file.readline()
while line != "":
@ -122,16 +118,16 @@ class Geometry(models.Model):
if line.startswith("facet"):
count = count + 1
if line.startswith("vertex"):
coords = vertex_pattern.match(line).groups();
coords = vertex_pattern.match(line).groups()
for i in range(0, 3):
x = float(coords[i])
if min_coord[i] != None :
if min_coord[i] is not None:
min_coord[i] = min(min_coord[i], x)
else:
min_coord[i] = x
if max_coord[i] != None :
if max_coord[i] is not None:
max_coord[i] = max(max_coord[i], x)
else:
max_coord[i] = x

View File

@ -1,11 +1,11 @@
from django.conf.urls import patterns, include, url
from django.urls import re_path
from views import GeometryView, GeometryListView, GeometryCreate, GeometryDelete
urlpatterns = patterns('',
url(r'^new/$', GeometryCreate.as_view(), name='geometry_create'),
url(r'^list/$', GeometryListView.as_view(), name='geometry_list'),
url(r'^list/page/(?P<page>[0-9]+)/$', GeometryListView.as_view(), name='geometry_list'),
url(r'^delete/(?P<id>\d+)/$', GeometryDelete.as_view(), name='geometry_delete'),
url(r'^(?P<id>\d+)/$', GeometryView.as_view(), name='geometry_details'))
from pastebin.views import GeometryView, GeometryListView, GeometryCreate, GeometryDelete
urlpatterns = [
re_path(r'^new/$', GeometryCreate.as_view(), name='geometry_create'),
re_path(r'^list/$', GeometryListView.as_view(), name='geometry_list'),
re_path(r'^list/page/(?P<page>[0-9]+)/$', GeometryListView.as_view(), name='geometry_list'),
re_path(r'^delete/(?P<id>\d+)/$', GeometryDelete.as_view(), name='geometry_delete'),
re_path(r'^(?P<id>\d+)/$', GeometryView.as_view(), name='geometry_details')
]

View File

@ -1,21 +1,23 @@
from django.views.generic.edit import CreateView, DeleteView
from django.views.generic.detail import DetailView
from django.core.urlresolvers import reverse
from django.urls import reverse
from django.views.generic.base import ContextMixin
from django.core.exceptions import PermissionDenied
from django.views.generic.base import TemplateView
from django.views.generic.list import ListView
from forms import GeometryForm, AnonymousGeometryForm
from models import Geometry
from pastebin.forms import GeometryForm, AnonymousGeometryForm
from pastebin.models import Geometry
class LastesGeometriesMixin(ContextMixin):
def get_context_data(self, **kwargs):
context = super(LastesGeometriesMixin, self).get_context_data(**kwargs)
context['latest_geometries'] = Geometry.get_latest()
return context
class GeometryListView(ListView, LastesGeometriesMixin):
queryset = Geometry.objects.all().filter(public=True).order_by('date')
paginate_by = 50
@ -54,6 +56,7 @@ class GeometryCreate(CreateView, LastesGeometriesMixin):
return res
class GeometryDelete(DeleteView, LastesGeometriesMixin):
model = Geometry
pk_url_kwarg = 'id'

View File

@ -1,5 +1,6 @@
Django==1.5.4
Werkzeug==0.9.4
django-extensions==1.2.2
six==1.4.1
wsgiref==0.1.2
asgiref==3.7.2
Django==4.2.3
django-extensions==3.2.3
MarkupSafe==2.1.3
sqlparse==0.4.4
Werkzeug==2.3.6

View File

@ -2,6 +2,7 @@ from django import forms
from django.forms import ModelForm
from django.contrib.auth.models import User
class UserCreateForm(ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
@ -10,7 +11,6 @@ class UserCreateForm(ModelForm):
model = User
fields = ['username', 'email']
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
@ -20,7 +20,6 @@ class UserCreateForm(ModelForm):
return password1
def clean_email(self):
# Make sure Email is unique
email = self.cleaned_data.get("email")
@ -29,7 +28,6 @@ class UserCreateForm(ModelForm):
return email
def save(self, commit=True):
user = super(UserCreateForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
@ -39,7 +37,6 @@ class UserCreateForm(ModelForm):
return user
class UserUpdateForm(ModelForm):
new_password1 = forms.CharField(label='New Password',
widget=forms.PasswordInput,
@ -53,7 +50,6 @@ class UserUpdateForm(ModelForm):
model = User
fields = ['email']
def clean_current_password(self):
current_password = self.cleaned_data.get("current_password")
@ -62,7 +58,6 @@ class UserUpdateForm(ModelForm):
return current_password
def clean_new_password2(self):
password1 = self.cleaned_data.get("new_password1")
password2 = self.cleaned_data.get("new_password2")
@ -72,7 +67,6 @@ class UserUpdateForm(ModelForm):
return password1
def clean_email(self):
# Make sure Email is still unique
email = self.cleaned_data.get("email")
@ -81,7 +75,6 @@ class UserUpdateForm(ModelForm):
return email
def save(self, commit=True):
user = super(UserUpdateForm, self).save(commit=False)

View File

@ -1,37 +1,57 @@
from django.conf.urls import patterns, include, url
from django.core.urlresolvers import reverse_lazy
from django.urls import re_path, path, reverse_lazy
from django.contrib.auth import views as auth_views
from pastebin.models import Geometry
from views import *
from users.views import *
urlpatterns = patterns('',
url(r'^signup/$', UserCreateView.as_view(), name='signup'),
url(r'^confirm/(?P<user_id>\d+)/$', SendConfirmationView.as_view(), name='send_confirmation'),
url(r'^confirm/(?P<user_id>\d+)/(?P<token>.+)/$', CheckConfirmationView.as_view(), name='check_confirmation'),
url(r'^update/(?P<user_id>\d+)/$', UserUpdateView.as_view(), name='user_update'),
url(r'^password/reset/$', 'django.contrib.auth.views.password_reset', {'extra_context' : {'latest_geometries' : Geometry.get_latest()},
urlpatterns = [
re_path(r'^signup/$', UserCreateView.as_view(), name='signup'),
re_path(r'^confirm/(?P<user_id>\d+)/$', SendConfirmationView.as_view(), name='send_confirmation'),
re_path(r'^confirm/(?P<user_id>\d+)/(?P<token>.+)/$',
CheckConfirmationView.as_view(),
name='check_confirmation'),
re_path(r'^update/(?P<user_id>\d+)/$', UserUpdateView.as_view(), name='user_update'),
path('password/reset/',
auth_views.PasswordResetView.as_view(), {
'extra_context': {
'latest_geometries': Geometry.get_latest()
},
'template_name': 'users/password_reset.html',
'post_reset_redirect' : reverse_lazy('password_reset_sent')},
'post_reset_redirect': reverse_lazy('password_reset_sent')
},
name='password_reset'),
url(r'^password/reset/(?P<uidb36>[0-9A-Za-z]+)/(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm', {'extra_context' : {'latest_geometries' : Geometry.get_latest()},
path('password/reset/confirm/',
auth_views.PasswordResetConfirmView.as_view(), {
'extra_context': {
'latest_geometries': Geometry.get_latest()
},
'template_name': 'users/password_reset_confirm.html',
'post_reset_redirect' : reverse_lazy('login')},
'post_reset_redirect': reverse_lazy('login')
},
name='password_reset_confirm'),
url(r'^password/reset/sent/$', 'django.contrib.auth.views.password_reset_done', {'extra_context' : {'latest_geometries' : Geometry.get_latest()},
'template_name' : 'users/password_reset_sent.html',},
path('password/reset/sent/',
auth_views.PasswordResetDoneView.as_view(), {
'extra_context': {
'latest_geometries': Geometry.get_latest()
},
'template_name': 'users/password_reset_sent.html',
},
name='password_reset_sent'),
url(r'^login/$', 'django.contrib.auth.views.login', {'extra_context' : {'latest_geometries' : Geometry.get_latest()},
'template_name' : 'users/login.html'},
path('login/',
auth_views.LoginView.as_view(), {
'extra_context': {
'latest_geometries': Geometry.get_latest()
},
'template_name': 'users/login.html'
},
name='login'),
url(r'^logout/$', 'django.contrib.auth.views.logout',{'extra_context' : {'latest_geometries' : Geometry.get_latest()},
'next_page' : reverse_lazy('login')},
path('logout/',
auth_views.LogoutView.as_view(), {
'extra_context': {
'latest_geometries': Geometry.get_latest()
},
'next_page': reverse_lazy('login')
},
name='logout'),
)
]

View File

@ -1,8 +1,8 @@
from django.views.generic.edit import CreateView, UpdateView
from django.views.generic.base import TemplateView
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.contrib.sites.models import get_current_site
from django.urls import reverse
from django.contrib.sites.shortcuts import get_current_site
from django.contrib.auth.tokens import default_token_generator
from django.template import loader
from django.utils.http import int_to_base36
@ -11,14 +11,14 @@ from django.core.exceptions import PermissionDenied
from pastebin.views import LastesGeometriesMixin
from forms import UserCreateForm, UserUpdateForm
from users.forms import UserCreateForm, UserUpdateForm
class UserCreateView(CreateView, LastesGeometriesMixin):
model = User
form_class = UserCreateForm
template_name = 'users/signup.html'
def get_success_url(self):
return reverse('send_confirmation', kwargs={'user_id': self.object.pk})
@ -36,7 +36,6 @@ class UserUpdateView(UpdateView, LastesGeometriesMixin):
return reverse('geometry_create')
class SendConfirmationView(TemplateView, LastesGeometriesMixin):
template_name = 'users/send_confirmation.html'
email_template_name = 'users/confirmation_email.txt'
@ -58,7 +57,11 @@ class SendConfirmationView(TemplateView, LastesGeometriesMixin):
site_name = get_current_site(self.request).name
uid = int_to_base36(user.pk)
token = default_token_generator.make_token(user)
link = request.build_absolute_uri(reverse('check_confirmation', kwargs={'user_id' : user.pk, 'token' : token}))
link = request.build_absolute_uri(
reverse('check_confirmation', kwargs={
'user_id': user.pk,
'token': token
}))
context = {
'email': user.email,
@ -71,11 +74,9 @@ class SendConfirmationView(TemplateView, LastesGeometriesMixin):
email = loader.render_to_string(self.email_template_name, context)
user.email_user(subject, email)
return super(SendConfirmationView, self).get(self, request, *args, **kwargs)
class CheckConfirmationView(TemplateView, LastesGeometriesMixin):
template_name = 'users/check_confirmation.html'
@ -99,6 +100,6 @@ class CheckConfirmationView(TemplateView, LastesGeometriesMixin):
user.is_active = True
user.save()
print "Acitvating %s" % user.username
print("Acitvating %s" % user.username)
return super(CheckConfirmationView, self).get(self, request, *args, **kwargs)