summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander2019-02-24 11:20:11 +0000
committerMagnus Hagander2019-02-24 11:22:51 +0000
commite08a73cb028c7b58099be08316613a3939458fe7 (patch)
tree35b2ebc36e91f5eb4756c76120d205b5b8b63ab2
parentf4640e320a126ee58d713a026fa7c09e01c2b00d (diff)
Fixes for pep8 compatibility
Also add a setup.py that's used to validate, and a git hook.
-rw-r--r--pgmailmgr/mailmgr/forms.py44
-rw-r--r--pgmailmgr/mailmgr/models.py31
-rw-r--r--pgmailmgr/mailmgr/views.py35
-rw-r--r--pgmailmgr/settings.py13
-rw-r--r--pgmailmgr/urls.py6
-rw-r--r--setup.cfg4
-rwxr-xr-xtools/githook/pre-commit38
7 files changed, 114 insertions, 57 deletions
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
+