From fb271941bb1892bbf9b646bf4d901dcbb514dca8 Mon Sep 17 00:00:00 2001 From: Oly Date: Sat, 28 Jan 2017 22:34:47 +0000 Subject: [PATCH] Cleaned up migrations, added refresh subscriptions command to update members status --- .drone.yml | 4 ++ docker-compose.yml | 54 +++++++-------- mhackspace/feeds/migrations/0001_initial.py | 33 +++++++-- .../migrations/0002_auto_20170104_2033.py | 30 -------- .../migrations/0003_auto_20170104_2035.py | 20 ------ .../feeds/migrations/0004_feed_enabled.py | 20 ------ .../feeds/migrations/0005_storing_articles.py | 69 ------------------- mhackspace/members/views.py | 2 +- .../management/commands/list_subscriptions.py | 2 +- .../commands/refresh_subscriptions.py | 51 ++++++++++++++ mhackspace/subscriptions/models.py | 0 mhackspace/templates/pages/members.html | 7 +- mhackspace/templates/users/user_detail.html | 19 ++++- mhackspace/users/forms.py | 6 +- mhackspace/users/migrations/0001_initial.py | 29 +++++++- .../migrations/0002_membership_userblurb.py | 36 ---------- .../users/migrations/0003_user_image.py | 20 ------ .../migrations/0004_auto_20170106_2030.py | 24 ------- .../migrations/0005_auto_20170108_0050.py | 28 -------- mhackspace/users/models.py | 40 +++++++++-- mhackspace/users/views.py | 18 ++--- 21 files changed, 208 insertions(+), 304 deletions(-) delete mode 100644 mhackspace/feeds/migrations/0002_auto_20170104_2033.py delete mode 100644 mhackspace/feeds/migrations/0003_auto_20170104_2035.py delete mode 100644 mhackspace/feeds/migrations/0004_feed_enabled.py delete mode 100644 mhackspace/feeds/migrations/0005_storing_articles.py create mode 100644 mhackspace/subscriptions/management/commands/refresh_subscriptions.py delete mode 100644 mhackspace/subscriptions/models.py delete mode 100644 mhackspace/users/migrations/0002_membership_userblurb.py delete mode 100644 mhackspace/users/migrations/0003_user_image.py delete mode 100644 mhackspace/users/migrations/0004_auto_20170106_2030.py delete mode 100644 mhackspace/users/migrations/0005_auto_20170108_0050.py diff --git a/.drone.yml b/.drone.yml index be2af8f..fb192f6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -9,6 +9,10 @@ pipeline: - cp -n env.example .env - python manage.py test mhackspace --verbosity 2 + deploy: + + + #volumes: # postgres_data_dev: {} # postgres_backup_dev: {} diff --git a/docker-compose.yml b/docker-compose.yml index 8f0abc6..3646dd9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,36 +23,36 @@ services: command: /gunicorn.sh env_file: .env - nginx: - build: ./compose/nginx - depends_on: - - django - - certbot +# nginx: +# build: ./compose/nginx +# depends_on: +# - django +# - certbot - ports: - - "0.0.0.0:80:80" +# ports: +# - "0.0.0.0:80:80" - environment: - - MY_DOMAIN_NAME=maidstone-hackspace.org.uk - ports: - - "0.0.0.0:80:80" - - "0.0.0.0:443:443" - volumes: - - /etc/letsencrypt:/etc/letsencrypt - - /var/lib/letsencrypt:/var/lib/letsencrypt +# environment: +# - MY_DOMAIN_NAME=maidstone-hackspace.org.uk +# ports: +# - "0.0.0.0:80:80" +# - "0.0.0.0:443:443" +# volumes: +# - /etc/letsencrypt:/etc/letsencrypt +# - /var/lib/letsencrypt:/var/lib/letsencrypt - certbot: - image: quay.io/letsencrypt/letsencrypt - command: bash -c "sleep 6 && certbot certonly -n --standalone -d maidstone-hackspace.org.uk --text --agree-tos --email support@maidstone-hackspace.org.uk --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --verbose --keep-until-expiring --standalone-supported-challenges http-01" - entrypoint: "" - volumes: - - /etc/letsencrypt:/etc/letsencrypt - - /var/lib/letsencrypt:/var/lib/letsencrypt - ports: - - "80" - - "443" - environment: - - TERM=xterm +# certbot: +# image: quay.io/letsencrypt/letsencrypt +# command: bash -c "sleep 6 && certbot certonly -n --standalone -d maidstone-hackspace.org.uk --text --agree-tos --email support@maidstone-hackspace.org.uk --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --verbose --keep-until-expiring --standalone-supported-challenges http-01" +# entrypoint: "" +# volumes: +# - /etc/letsencrypt:/etc/letsencrypt +# - /var/lib/letsencrypt:/var/lib/letsencrypt +# ports: +# - "80" +# - "443" +# environment: +# - TERM=xterm redis: diff --git a/mhackspace/feeds/migrations/0001_initial.py b/mhackspace/feeds/migrations/0001_initial.py index 53bcf3c..4a5c9b9 100644 --- a/mhackspace/feeds/migrations/0001_initial.py +++ b/mhackspace/feeds/migrations/0001_initial.py @@ -1,8 +1,12 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-04 14:04 +# Generated by Django 1.10.5 on 2017-01-28 18:38 from __future__ import unicode_literals from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import stdimage.models +import stdimage.utils class Migration(migrations.Migration): @@ -13,14 +17,35 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField()), + ('title', models.CharField(max_length=255)), + ('original_image', models.URLField(blank=True, max_length=255, null=True)), + ('image', stdimage.models.StdImageField(blank=True, null=True, upload_to=stdimage.utils.UploadToAutoSlugClassNameDir('title'))), + ('description', models.TextField()), + ('displayed', models.BooleanField(default=True)), + ('date', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), migrations.CreateModel( name='Feed', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('url', models.CharField(max_length=255)), + ('home_url', models.URLField(verbose_name='Site Home Page')), + ('feed_url', models.URLField(verbose_name='RSS Feed URL')), + ('title', models.CharField(max_length=255)), ('author', models.CharField(max_length=255)), - ('tags', models.CharField(max_length=255)), - ('image', models.ImageField(upload_to='')), + ('tags', models.CharField(blank=True, max_length=255)), + ('image', stdimage.models.StdImageField(blank=True, null=True, upload_to=stdimage.utils.UploadToAutoSlugClassNameDir('title'))), + ('enabled', models.BooleanField(default=True)), ], ), + migrations.AddField( + model_name='article', + name='feed', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='feeds.Feed'), + ), ] diff --git a/mhackspace/feeds/migrations/0002_auto_20170104_2033.py b/mhackspace/feeds/migrations/0002_auto_20170104_2033.py deleted file mode 100644 index 4f8bd15..0000000 --- a/mhackspace/feeds/migrations/0002_auto_20170104_2033.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-04 20:33 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('feeds', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='feed', - name='id', - field=models.IntegerField(primary_key=True, serialize=False), - ), - migrations.AlterField( - model_name='feed', - name='image', - field=models.ImageField(blank=True, upload_to=''), - ), - migrations.AlterField( - model_name='feed', - name='tags', - field=models.CharField(blank=True, max_length=255), - ), - ] diff --git a/mhackspace/feeds/migrations/0003_auto_20170104_2035.py b/mhackspace/feeds/migrations/0003_auto_20170104_2035.py deleted file mode 100644 index 55a38dc..0000000 --- a/mhackspace/feeds/migrations/0003_auto_20170104_2035.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-04 20:35 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('feeds', '0002_auto_20170104_2033'), - ] - - operations = [ - migrations.AlterField( - model_name='feed', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - ] diff --git a/mhackspace/feeds/migrations/0004_feed_enabled.py b/mhackspace/feeds/migrations/0004_feed_enabled.py deleted file mode 100644 index 9579887..0000000 --- a/mhackspace/feeds/migrations/0004_feed_enabled.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-04 21:39 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('feeds', '0003_auto_20170104_2035'), - ] - - operations = [ - migrations.AddField( - model_name='feed', - name='enabled', - field=models.BooleanField(default=True), - ), - ] diff --git a/mhackspace/feeds/migrations/0005_storing_articles.py b/mhackspace/feeds/migrations/0005_storing_articles.py deleted file mode 100644 index 0734fba..0000000 --- a/mhackspace/feeds/migrations/0005_storing_articles.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-08 03:42 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import stdimage.models -import stdimage.utils - - -class Migration(migrations.Migration): - - dependencies = [ - ('feeds', '0004_feed_enabled'), - ] - - operations = [ - migrations.CreateModel( - name='Article', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('url', models.URLField()), - ('title', models.CharField(max_length=255)), - ('original_image', models.URLField(blank=True, max_length=255, null=True)), - ('image', stdimage.models.StdImageField(blank=True, null=True, upload_to=stdimage.utils.UploadToAutoSlugClassNameDir('title'))), - ('description', models.TextField()), - ('displayed', models.BooleanField(default=True)), - ('date', models.DateTimeField(default=django.utils.timezone.now)), - ], - ), - migrations.RemoveField( - model_name='feed', - name='url', - ), - migrations.AddField( - model_name='feed', - name='feed_url', - field=models.URLField(default='http://thearduinoguy.org/?feed=rss2', verbose_name='RSS Feed URL'), - preserve_default=False, - ), - migrations.AddField( - model_name='feed', - name='home_url', - field=models.URLField(default='http://thearduinoguy.org/', verbose_name='Site Home Page'), - preserve_default=False, - ), - migrations.AddField( - model_name='feed', - name='title', - field=models.CharField(default='The Arduino Guy', max_length=255), - preserve_default=False, - ), - migrations.AlterField( - model_name='feed', - name='id', - field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), - ), - migrations.AlterField( - model_name='feed', - name='image', - field=stdimage.models.StdImageField(blank=True, null=True, upload_to=stdimage.utils.UploadToAutoSlugClassNameDir('title')), - ), - migrations.AddField( - model_name='article', - name='feed', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='feeds.Feed'), - ), - ] diff --git a/mhackspace/members/views.py b/mhackspace/members/views.py index dbc597c..34972b2 100644 --- a/mhackspace/members/views.py +++ b/mhackspace/members/views.py @@ -10,7 +10,7 @@ from mhackspace.users.models import User class MemberListView(LoginRequiredMixin, ListView): template_name = 'pages/members.html' - queryset = User.objects.prefetch_related('users', 'groups') + queryset = User.objects.prefetch_related('user', 'groups') paginate_by = 10 def get_context_data(self, **kwargs): diff --git a/mhackspace/subscriptions/management/commands/list_subscriptions.py b/mhackspace/subscriptions/management/commands/list_subscriptions.py index a4e1d39..dc8f84c 100644 --- a/mhackspace/subscriptions/management/commands/list_subscriptions.py +++ b/mhackspace/subscriptions/management/commands/list_subscriptions.py @@ -24,4 +24,4 @@ class Command(BaseCommand): for sub in provider.fetch_subscriptions(): self.stdout.write( self.style.SUCCESS( - '\t{reference} - {amount} - {status} - {email}'.format(**sub))) + '\t{start_date} {reference} - {amount} - {status} - {email}'.format(**sub))) diff --git a/mhackspace/subscriptions/management/commands/refresh_subscriptions.py b/mhackspace/subscriptions/management/commands/refresh_subscriptions.py new file mode 100644 index 0000000..9406808 --- /dev/null +++ b/mhackspace/subscriptions/management/commands/refresh_subscriptions.py @@ -0,0 +1,51 @@ +from datetime import datetime +from django.utils import timezone +from django.contrib.auth.models import Group +from django.forms.models import model_to_dict +from django.core.management.base import BaseCommand +from mhackspace.subscriptions.payments import select_provider +from mhackspace.users.models import Membership, User + + +class Command(BaseCommand): + help = 'Update user subscriptions' + + def handle(self, *args, **options): + provider = select_provider('gocardless') + + self.stdout.write( + self.style.NOTICE( + '== Gocardless subscriptions ==')) + + Membership.objects.all().delete() + subscriptions = [] + + group = Group.objects.get(name='member') + + for sub in provider.fetch_subscriptions(): + try: + user_model = User.objects.get(email=sub.get('email')) + if sub.get('status') == 'active': + user_model.groups.add(group) + except User.DoesNotExist: + user_model = None + + self.stdout.write(sub.get('status')) + subscriptions.append( + Membership( + user= user_model, + email= sub.get('email'), + reference= sub.get('reference'), + payment= 10.00, + # 'date'= sub.get('start_date'), + date=timezone.now(), + status=Membership.lookup_status(name=sub.get('status')) + ) + ) + + self.stdout.write( + self.style.SUCCESS( + '\t{reference} - {payment} - {status} - {email}'.format(**model_to_dict(subscriptions[-1])))) + + Membership.objects.bulk_create(subscriptions) + diff --git a/mhackspace/subscriptions/models.py b/mhackspace/subscriptions/models.py deleted file mode 100644 index e69de29..0000000 diff --git a/mhackspace/templates/pages/members.html b/mhackspace/templates/pages/members.html index e009e7c..265c63a 100644 --- a/mhackspace/templates/pages/members.html +++ b/mhackspace/templates/pages/members.html @@ -4,8 +4,8 @@ Members feed
-
Users {{ paginator.count }}
-
Members {{ total }}
+
Users {{ paginator.count }}
+
Members {{ total }}
@@ -17,13 +17,14 @@ Members feed

{{ member.name }}

{{ member.users.description }}

{{ member.users.skills }}

+

{{ member.status }}

{% for group in member.groups.all %} {{ group.name }} {% endfor %}
-

{{ member.userblurb }}

+

{{ member.blurb }}

View Original diff --git a/mhackspace/templates/users/user_detail.html b/mhackspace/templates/users/user_detail.html index 13f5a1b..054fb0e 100644 --- a/mhackspace/templates/users/user_detail.html +++ b/mhackspace/templates/users/user_detail.html @@ -5,7 +5,21 @@ {% block content %}
- +

Profile

@@ -18,13 +32,14 @@

Member since

Description: {{ blurb.description }}

Skills: {{ blurb.description }}

+

Membership Status: {{ membership.get_status }}

Joined
-

MHS{{ user.id|stringformat:"05d" }}

Change me

+

MHS{{ user.id|stringformat:"05d" }}

{{user.name}}{{user.last_name}}

Cancel Membership
diff --git a/mhackspace/users/forms.py b/mhackspace/users/forms.py index 73b16ff..4c2b43e 100644 --- a/mhackspace/users/forms.py +++ b/mhackspace/users/forms.py @@ -2,9 +2,9 @@ from django.db import models from django.forms import ModelForm -from .models import UserBlurb +from .models import Blurb -class UserBlurbForm(ModelForm): +class BlurbForm(ModelForm): class Meta: - model = UserBlurb + model = Blurb exclude = ['user'] diff --git a/mhackspace/users/migrations/0001_initial.py b/mhackspace/users/migrations/0001_initial.py index e76c333..def69a6 100644 --- a/mhackspace/users/migrations/0001_initial.py +++ b/mhackspace/users/migrations/0001_initial.py @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10.1 on 2016-09-23 04:36 +# Generated by Django 1.10.5 on 2017-01-28 19:46 from __future__ import unicode_literals +from django.conf import settings import django.contrib.auth.models import django.contrib.auth.validators from django.db import migrations, models +import django.db.models.deletion import django.utils.timezone +import stdimage.models class Migration(migrations.Migration): @@ -32,16 +35,38 @@ class Migration(migrations.Migration): ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('name', models.CharField(blank=True, max_length=255, verbose_name='Name of User')), + ('image', stdimage.models.StdImageField(blank=True, null=True, upload_to='avatars/')), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ], options={ - 'verbose_name_plural': 'users', 'verbose_name': 'user', 'abstract': False, + 'verbose_name_plural': 'users', }, managers=[ ('objects', django.contrib.auth.models.UserManager()), ], ), + migrations.CreateModel( + name='Blurb', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('skills', models.CharField(max_length=255)), + ('description', models.TextField()), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Membership', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('payment', models.DecimalField(decimal_places=2, default=0.0, max_digits=6)), + ('date', models.DateTimeField()), + ('reference', models.CharField(max_length=255)), + ('status', models.PositiveSmallIntegerField(default=0)), + ('email', models.CharField(max_length=255)), + ('user', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user', to=settings.AUTH_USER_MODEL)), + ], + ), ] diff --git a/mhackspace/users/migrations/0002_membership_userblurb.py b/mhackspace/users/migrations/0002_membership_userblurb.py deleted file mode 100644 index 4e0c458..0000000 --- a/mhackspace/users/migrations/0002_membership_userblurb.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-06 08:53 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Membership', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('payment', models.DecimalField(decimal_places=2, max_digits=6)), - ('date', models.DateTimeField()), - ('reference', models.CharField(max_length=255)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='UserBlurb', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('skills', models.CharField(max_length=255)), - ('description', models.TextField()), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/mhackspace/users/migrations/0003_user_image.py b/mhackspace/users/migrations/0003_user_image.py deleted file mode 100644 index f55e304..0000000 --- a/mhackspace/users/migrations/0003_user_image.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-06 19:03 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0002_membership_userblurb'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='/upload/avatars'), - ), - ] diff --git a/mhackspace/users/migrations/0004_auto_20170106_2030.py b/mhackspace/users/migrations/0004_auto_20170106_2030.py deleted file mode 100644 index c98e20c..0000000 --- a/mhackspace/users/migrations/0004_auto_20170106_2030.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-06 20:30 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0003_user_image'), - ] - - operations = [ - migrations.RenameModel( - old_name='Membership', - new_name='UserMembership', - ), - migrations.AlterField( - model_name='user', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='avatars/'), - ), - ] diff --git a/mhackspace/users/migrations/0005_auto_20170108_0050.py b/mhackspace/users/migrations/0005_auto_20170108_0050.py deleted file mode 100644 index 2d05065..0000000 --- a/mhackspace/users/migrations/0005_auto_20170108_0050.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-01-08 00:50 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import stdimage.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0004_auto_20170106_2030'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='image', - field=stdimage.models.StdImageField(blank=True, null=True, upload_to='avatars/'), - ), - migrations.AlterField( - model_name='userblurb', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='users', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/mhackspace/users/models.py b/mhackspace/users/models.py index 9c2b3e8..b056cac 100644 --- a/mhackspace/users/models.py +++ b/mhackspace/users/models.py @@ -29,14 +29,44 @@ class User(AbstractUser): return reverse('users:detail', kwargs={'username': self.username}) -class UserBlurb(models.Model): - user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='users') +class Blurb(models.Model): + user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='+') skills = models.CharField(max_length=255) description = models.TextField() -class UserMembership(models.Model): - user = models.ForeignKey(settings.AUTH_USER_MODEL) - payment = models.DecimalField(max_digits=6, decimal_places=2) +MEMBERSHIP_STRING = { + 0: 'Non Member', + 1: 'Member', + 3: 'Membership Expired' +} + +MEMBERSHIP_STATUS = { + 'active': 1, + 'cancelled': 2 +} + +class Membership(models.Model): + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + null=True, blank=True, + default=None, + related_name='user' + ) + payment = models.DecimalField(max_digits=6, decimal_places=2, default=0.0) date = models.DateTimeField() reference = models.CharField(max_length=255) + status = models.PositiveSmallIntegerField(default=0) + email = models.CharField(max_length=255) + + @property + def get_status(self): + return MEMBERSHIP_STRING[self.status] + + def lookup_status(name): + if not name: + return 0 + return MEMBERSHIP_STATUS.get(name.lower(), 0) + + def __str__(self): + return self.reference diff --git a/mhackspace/users/views.py b/mhackspace/users/views.py index bbdfb07..e511bcd 100644 --- a/mhackspace/users/views.py +++ b/mhackspace/users/views.py @@ -7,10 +7,10 @@ from django.views.generic import DetailView, ListView, RedirectView, UpdateView from django.contrib.auth.mixins import LoginRequiredMixin from .models import User -from .models import UserBlurb -from .models import UserMembership +from .models import Blurb +from .models import Membership -from .forms import UserBlurbForm +from .forms import BlurbForm class UserDetailView(LoginRequiredMixin, DetailView): model = User @@ -21,8 +21,8 @@ class UserDetailView(LoginRequiredMixin, DetailView): def get_context_data(self, **kwargs): # xxx will be available in the template as the related objects context = super(UserDetailView, self).get_context_data(**kwargs) - context['blurb'] = UserBlurb.objects.filter(user=self.get_object()).first() - context['membership'] = UserMembership.objects.filter(user=self.get_object()).first() + context['blurb'] = Blurb.objects.filter(user=self.get_object()).first() + context['membership'] = Membership.objects.filter(user=self.get_object()).first() return context class UserRedirectView(LoginRequiredMixin, RedirectView): @@ -45,8 +45,8 @@ class UserUpdateView(LoginRequiredMixin, UpdateView): def get_context_data(self, **kwargs): context = super(UserUpdateView, self).get_context_data(**kwargs) - profile = UserBlurb.objects.filter(user=self.get_object()).first() - context['form_blurb'] = UserBlurbForm(instance=profile) + profile = Blurb.objects.filter(user=self.get_object()).first() + context['form_blurb'] = BlurbForm(instance=profile) return context def get_object(self): @@ -54,8 +54,8 @@ class UserUpdateView(LoginRequiredMixin, UpdateView): return User.objects.get(username=self.request.user.username) def form_valid(self, form): - profile = UserBlurb.objects.filter(user=self.get_object()).first() - form_blurb = UserBlurbForm(self.request.POST, instance=profile) + profile = Blurb.objects.filter(user=self.get_object()).first() + form_blurb = BlurbForm(self.request.POST, instance=profile) if form_blurb.is_valid(): blurb_model = form_blurb.save(commit=False) blurb_model.user = self.request.user