From e08a73cb028c7b58099be08316613a3939458fe7 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Sun, 24 Feb 2019 12:20:11 +0100 Subject: [PATCH] Fixes for pep8 compatibility Also add a setup.py that's used to validate, and a git hook. --- pgmailmgr/mailmgr/forms.py | 44 ++++++++++++++++++++----------------- pgmailmgr/mailmgr/models.py | 31 ++++++++++++++++---------- pgmailmgr/mailmgr/views.py | 35 +++++++++++++++-------------- pgmailmgr/settings.py | 13 +++++------ pgmailmgr/urls.py | 6 ++--- setup.cfg | 4 ++++ tools/githook/pre-commit | 38 ++++++++++++++++++++++++++++++++ 7 files changed, 114 insertions(+), 57 deletions(-) create mode 100644 setup.cfg create mode 100755 tools/githook/pre-commit diff --git a/pgmailmgr/mailmgr/forms.py b/pgmailmgr/mailmgr/forms.py index bc957ec..1d72f00 100644 --- a/pgmailmgr/mailmgr/forms.py +++ b/pgmailmgr/mailmgr/forms.py @@ -4,6 +4,7 @@ from django.db import connection from models import * + class VirtualUserForm(forms.ModelForm): class Meta: model = VirtualUser @@ -14,13 +15,15 @@ class VirtualUserForm(forms.ModelForm): self.user = user def clean_local_domain(self): - if not self.instance.pk: return self.cleaned_data['local_domain'] + if not self.instance.pk: + return self.cleaned_data['local_domain'] if self.cleaned_data['local_domain'] != self.instance.local_domain: raise ValidationError("Can't change local domain!") return self.cleaned_data['local_domain'] - + def clean_local_part(self): - if not self.instance.pk: return self.cleaned_data['local_part'] + if not self.instance.pk: + return self.cleaned_data['local_part'] if self.cleaned_data['local_part'] != self.instance.local_part: raise ValidationError("Renaming accounts is not possible - you have to delete and add!") return self.cleaned_data['local_part'] @@ -35,23 +38,23 @@ class VirtualUserForm(forms.ModelForm): # Changing password requires calling pgcrypto. So let's do that... curs = connection.cursor() curs.execute("SELECT public.crypt(%(pwd)s, public.gen_salt('md5'))", { - 'pwd': self.cleaned_data['passwd'] - }) + 'pwd': self.cleaned_data['passwd'] + }) return curs.fetchall()[0][0] - + return self.cleaned_data['passwd'] def clean(self): - if not self.cleaned_data.has_key('local_part'): + if 'local_part' not in self.cleaned_data: return {} # Validate that the pattern is allowed curs = connection.cursor() curs.execute("SELECT 1 FROM mailmgr_userpermissions WHERE user_id=%(uid)s AND domain_id=%(domain)s AND %(lp)s ~* ('^'||pattern||'$')", { - 'uid': self.user.pk, - 'domain': self.cleaned_data['local_domain'].pk, - 'lp': self.cleaned_data['local_part'], - }) + 'uid': self.user.pk, + 'domain': self.cleaned_data['local_domain'].pk, + 'lp': self.cleaned_data['local_part'], + }) perms = curs.fetchall() if len(perms) < 1: @@ -71,7 +74,6 @@ class VirtualUserForm(forms.ModelForm): return self.cleaned_data - class ForwarderForm(forms.ModelForm): class Meta: model = Forwarder @@ -82,28 +84,30 @@ class ForwarderForm(forms.ModelForm): self.user = user def clean_local_domain(self): - if not self.instance.pk: return self.cleaned_data['local_domain'] + if not self.instance.pk: + return self.cleaned_data['local_domain'] if self.cleaned_data['local_domain'] != self.instance.local_domain: raise ValidationError("Can't change local domain!") return self.cleaned_data['local_domain'] - + def clean_local_part(self): - if not self.instance.pk: return self.cleaned_data['local_part'] + if not self.instance.pk: + return self.cleaned_data['local_part'] if self.cleaned_data['local_part'] != self.instance.local_part: raise ValidationError("Renaming forwarders is not possible - you have to delete and add!") return self.cleaned_data['local_part'] def clean(self): - if not self.cleaned_data.has_key('local_part'): + if 'local_part' not in self.cleaned_data: return {} # Validate that the pattern is allowed curs = connection.cursor() curs.execute("SELECT 1 FROM mailmgr_userpermissions WHERE user_id=%(uid)s AND domain_id=%(domain)s AND %(lp)s ~* ('^'||pattern||'$')", { - 'uid': self.user.pk, - 'domain': self.cleaned_data['local_domain'].pk, - 'lp': self.cleaned_data['local_part'], - }) + 'uid': self.user.pk, + 'domain': self.cleaned_data['local_domain'].pk, + 'lp': self.cleaned_data['local_part'], + }) perms = curs.fetchall() if len(perms) < 1: diff --git a/pgmailmgr/mailmgr/models.py b/pgmailmgr/mailmgr/models.py index 86100b4..1172605 100644 --- a/pgmailmgr/mailmgr/models.py +++ b/pgmailmgr/mailmgr/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.auth.models import User from django.db.models import signals + class LocalDomain(models.Model): local_domain_id = models.AutoField(null=False, primary_key=True) domain_name = models.CharField(max_length=100, null=False, blank=False) @@ -13,10 +14,12 @@ class LocalDomain(models.Model): return self.domain_name trigger_update = True + class Meta: - ordering=('domain_name',) - db_table='mail"."local_domains' - managed=False + ordering = ('domain_name',) + db_table = 'mail"."local_domains' + managed = False + class Forwarder(models.Model): forwarder_id = models.AutoField(null=False, primary_key=True) @@ -28,10 +31,12 @@ class Forwarder(models.Model): return "%s@%s -> %s" % (self.local_part, self.local_domain.domain_name, self.remote_name) trigger_update = True + class Meta: - ordering=('local_part',) - db_table='mail"."forwarder' - managed=False + ordering = ('local_part',) + db_table = 'mail"."forwarder' + managed = False + class VirtualUser(models.Model): virtual_user_id = models.AutoField(null=False, primary_key=True) @@ -45,11 +50,12 @@ class VirtualUser(models.Model): return "%s@%s (%s)" % (self.local_part, self.local_domain.domain_name, self.full_name or '') trigger_update = True + class Meta: - ordering=('local_part',) - db_table='mail"."virtual_user' - managed=False - unique_together=('local_domain', 'local_part', ) + ordering = ('local_part',) + db_table = 'mail"."virtual_user' + managed = False + unique_together = ('local_domain', 'local_part', ) class UserPermissions(models.Model): @@ -60,6 +66,7 @@ class UserPermissions(models.Model): def __unicode__(self): return "%s -> %s pattern '%s'" % (self.user, self.domain, self.pattern) + class Log(models.Model): user = models.ForeignKey(User, null=False) when = models.DateTimeField(null=False, auto_now=True) @@ -69,7 +76,8 @@ class Log(models.Model): return "%s (%s): %s" % (self.when, self.user, self.what) class Meta: - ordering=('-when',) + ordering = ('-when',) + def pgmail_save_handler(sender, **kwargs): if hasattr(sender, 'trigger_update') and sender.trigger_update: @@ -78,4 +86,5 @@ def pgmail_save_handler(sender, **kwargs): with open('/tmp/.mailmgr_update', 'w') as f: pass + signals.post_save.connect(pgmail_save_handler) diff --git a/pgmailmgr/mailmgr/views.py b/pgmailmgr/mailmgr/views.py index 958f85b..48d2093 100644 --- a/pgmailmgr/mailmgr/views.py +++ b/pgmailmgr/mailmgr/views.py @@ -8,21 +8,24 @@ from django.db import transaction from models import * from forms import * + def log(user, what): l = Log() l.user = user l.what = what l.save() + @login_required def home(request): users = VirtualUser.objects.extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]) forwards = Forwarder.objects.extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]) return render(request, 'home.html', { - 'users': users, - 'forwarders': forwards, - }) + 'users': users, + 'forwarders': forwards, + }) + @transaction.atomic @login_required @@ -38,26 +41,27 @@ def userform(request, userparam): if request.method == 'POST': form = VirtualUserForm(data=request.POST, instance=vu, user=request.user) if request.POST['passwd'] != vu.passwd: - password_changed=True + password_changed = True else: - password_changed=False + password_changed = False if form.is_valid(): form.save() messages.add_message(request, messages.INFO, 'User %s updated' % vu) if password_changed: messages.add_message(request, messages.INFO, 'Password changed for user %s' % vu) - log(request.user, "%s user %s, including changing the password" % (userparam=='add' and 'Added' or 'Updated', vu)) + log(request.user, "%s user %s, including changing the password" % (userparam == 'add' and 'Added' or 'Updated', vu)) else: - log(request.user, "%s user %s, without changing the password" % (userparam=='add' and 'Added' or 'Updated', vu)) + log(request.user, "%s user %s, without changing the password" % (userparam == 'add' and 'Added' or 'Updated', vu)) return HttpResponseRedirect('/') else: # Generate a new form form = VirtualUserForm(instance=vu, user=request.user) - return render(request,'form.html', { - 'form': form, - 'savebutton': (userparam == 'new') and "New" or "Save" - }) + return render(request, 'form.html', { + 'form': form, + 'savebutton': (userparam == 'new') and "New" or "Save" + }) + @transaction.atomic @login_required @@ -74,7 +78,7 @@ def forwarderform(request, userparam): form = ForwarderForm(data=request.POST, instance=fwd, user=request.user) if form.is_valid(): form.save() - log(request.user, "%s forwarding %s -> %s" % (userparam=='add' and 'Added' or 'Updated', fwd, fwd.remote_name)) + log(request.user, "%s forwarding %s -> %s" % (userparam == 'add' and 'Added' or 'Updated', fwd, fwd.remote_name)) messages.add_message(request, messages.INFO, 'Forwarder %s updated' % fwd) return HttpResponseRedirect('/') else: @@ -82,7 +86,6 @@ def forwarderform(request, userparam): form = ForwarderForm(instance=fwd, user=request.user) return render(request, 'form.html', { - 'form': form, - 'savebutton': (userparam == 'new') and "New" or "Save" - }) - + 'form': form, + 'savebutton': (userparam == 'new') and "New" or "Save" + }) diff --git a/pgmailmgr/settings.py b/pgmailmgr/settings.py index 279319c..75c3b98 100644 --- a/pgmailmgr/settings.py +++ b/pgmailmgr/settings.py @@ -14,7 +14,7 @@ MANAGERS = ADMINS DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'pgmail', # Or path to database file if using sqlite3. 'USER': 'pgmail', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. @@ -82,12 +82,10 @@ STATICFILES_DIRS = ( STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', -# 'django.contrib.staticfiles.finders.DefaultStorageFinder', ) # Make this unique, and don't share it with anybody. -#SECRET_KEY lives in settings_local.py - +# SECRET_KEY lives in settings_local.py MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', @@ -159,7 +157,8 @@ AUTHENTICATION_BACKENDS = ( 'pgmailmgr.auth.AuthBackend', ) -DEBUG=False -SESSION_COOKIE_SECURE= True -SESSION_COOKIE_DOMAIN="webmail.postgresql.org" +DEBUG = False +SESSION_COOKIE_SECURE = True +SESSION_COOKIE_DOMAIN = "webmail.postgresql.org" + from settings_local import * diff --git a/pgmailmgr/urls.py b/pgmailmgr/urls.py index b91efc4..9e18e02 100644 --- a/pgmailmgr/urls.py +++ b/pgmailmgr/urls.py @@ -1,12 +1,12 @@ from django.conf.urls import include, url +import pgmailmgr.mailmgr.views as views +import pgmailmgr.auth + # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() -import pgmailmgr.mailmgr.views as views -import pgmailmgr.auth - urlpatterns = [ url(r'^$', views.home), url(r'^user/(\d+|add)/$', views.userform), diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..084dd6b --- /dev/null +++ b/setup.cfg @@ -0,0 +1,4 @@ +[pycodestyle] +statistics=True +ignore=E402,E501,E741 +max-line-length=120 diff --git a/tools/githook/pre-commit b/tools/githook/pre-commit new file mode 100755 index 0000000..8d0a87d --- /dev/null +++ b/tools/githook/pre-commit @@ -0,0 +1,38 @@ +#!/bin/sh + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +FILES=$(git diff-index --name-only --diff-filter=ACMR --cached $against -- |egrep ".py$") +if [ "$FILES" != "" ]; then + # We want to look at the staged version only, so we have to run it once for + # each file. + E=0 + for F in ${FILES}; do + P=$(git show ":$F" | python -c "import sys; compile(sys.stdin.read(), '/dev/null', 'exec')") + if [ "$?" != "0" ]; then + echo "Errors in $F" + echo $P + E=1 + continue + fi + + R=$(git show ":$F" | pep8 -) + if [ "$?" != "0" ]; then + echo "Errors in $F" + echo "$R" + E=1 + fi + done + if [ "$E" != "0" ]; then + exit 1 + fi + + echo Basic python checks passed. +fi + -- 2.39.5