diff --git a/bikeshop_project/core/admin.py b/bikeshop_project/core/admin.py index 8c38f3f..cedce61 100644 --- a/bikeshop_project/core/admin.py +++ b/bikeshop_project/core/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin +from .models import Membership, Payment # Register your models here. +admin.site.register([Membership, Payment]) diff --git a/bikeshop_project/core/forms.py b/bikeshop_project/core/forms.py new file mode 100644 index 0000000..2fce3f8 --- /dev/null +++ b/bikeshop_project/core/forms.py @@ -0,0 +1,77 @@ +import logging +from django.forms import BooleanField, CharField, CheckboxInput, RadioSelect, ModelForm, TextInput, HiddenInput, ChoiceField + +from registration.models import Member + +from .models import Membership, Payment + +logger = logging.getLogger('bikeshop') + + +class MembershipForm(ModelForm): + member = CharField(required=True, widget=HiddenInput()) + self_ident_other = CharField(required=False, label='Self identification', + widget=TextInput(attrs={'class': 'mdl-textfield__input'})) + gender_other = CharField(required=False, label='Other', widget=TextInput(attrs={'class': 'mdl-textfield__input'})) + safe_space = BooleanField(required=True, widget=CheckboxInput( + attrs={'class': 'mdl-checkbox__input'} + )) + respect_community = BooleanField(required=True, widget=CheckboxInput( + attrs={'class': 'mdl-checkbox__input'} + )) + give_back = BooleanField(required=True, widget=CheckboxInput( + attrs={'class': 'mdl-checkbox__input'} + )) + respect_shop = BooleanField(required=True, widget=CheckboxInput( + attrs={'class': 'mdl-checkbox__input'} + )) + + class Meta: + model = Membership + fields = ['renewed_at', 'self_identification', 'gender'] + + self_ident_choices = ( + ('First Nations; Métis; or Inuit', 'First Nations; Métis; or Inuit'), + ('visible minority', 'Visible Minority'), + ('caucasian', 'Caucasian'), + ('other', 'Other') + ) + + gender_choices = ( + ('male', 'Male'), + ('female', 'Female'), + ('other', 'Other') + ) + + widgets = { + 'self_identification': RadioSelect(choices=self_ident_choices, attrs={'class': 'mdl-radio__button'}), + 'gender': RadioSelect(choices=gender_choices, attrs={'class': 'mdl-radio__button'}), + 'renewed_at': TextInput(attrs={'class': 'mdl-textfield__input'}), + } + + def save(self, commit=True): + instance = super(MembershipForm, self).save(commit=False) + member = Member.objects.get(id=self.cleaned_data['member']) + instance.member = member + logger.debug(self.cleaned_data['self_identification']) + logger.debug(self.cleaned_data['gender']) + + if self.cleaned_data['gender_other']: + instance.gender = self.cleaned_data['gender_other'] + + if self.cleaned_data['self_ident_other']: + instance.self_identification = self.cleaned_data['self_ident_other'] + + if commit: + instance.save() + + return instance + + +class PaymentForm(ModelForm): + class Meta: + model = Payment + fields = ['type'] + widgets = { + 'type': RadioSelect(attrs={'class': 'mdl-radio__button'}) + } diff --git a/bikeshop_project/core/migrations/0007_auto_20160501_2253.py b/bikeshop_project/core/migrations/0007_auto_20160501_2253.py new file mode 100644 index 0000000..1219ac9 --- /dev/null +++ b/bikeshop_project/core/migrations/0007_auto_20160501_2253.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-01 22:53 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0006_auto_20160410_1833'), + ] + + operations = [ + migrations.RemoveField( + model_name='membership', + name='acknowledgement', + ), + migrations.RemoveField( + model_name='membership', + name='community', + ), + migrations.RemoveField( + model_name='membership', + name='give_back', + ), + migrations.RemoveField( + model_name='membership', + name='safe_space', + ), + ] diff --git a/bikeshop_project/core/migrations/0008_auto_20160526_0059.py b/bikeshop_project/core/migrations/0008_auto_20160526_0059.py new file mode 100644 index 0000000..b980641 --- /dev/null +++ b/bikeshop_project/core/migrations/0008_auto_20160526_0059.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-26 00:59 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0007_auto_20160501_2253'), + ] + + operations = [ + migrations.RemoveField( + model_name='payment', + name='membership', + ), + migrations.AddField( + model_name='membership', + name='payment', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Payment'), + ), + ] diff --git a/bikeshop_project/core/migrations/0009_remove_membership_member.py b/bikeshop_project/core/migrations/0009_remove_membership_member.py new file mode 100644 index 0000000..6a8d3ba --- /dev/null +++ b/bikeshop_project/core/migrations/0009_remove_membership_member.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-26 01:50 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0008_auto_20160526_0059'), + ] + + operations = [ + migrations.RemoveField( + model_name='membership', + name='member', + ), + ] diff --git a/bikeshop_project/core/migrations/0010_membership_member.py b/bikeshop_project/core/migrations/0010_membership_member.py new file mode 100644 index 0000000..c956f08 --- /dev/null +++ b/bikeshop_project/core/migrations/0010_membership_member.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-31 02:31 +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 = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('core', '0009_remove_membership_member'), + ] + + operations = [ + migrations.AddField( + model_name='membership', + name='member', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='membership', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/bikeshop_project/core/migrations/0011_auto_20160531_0233.py b/bikeshop_project/core/migrations/0011_auto_20160531_0233.py new file mode 100644 index 0000000..b310553 --- /dev/null +++ b/bikeshop_project/core/migrations/0011_auto_20160531_0233.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-31 02:33 +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 = [ + ('core', '0010_membership_member'), + ] + + operations = [ + migrations.AlterField( + model_name='membership', + name='member', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/bikeshop_project/core/migrations/0012_auto_20160531_0234.py b/bikeshop_project/core/migrations/0012_auto_20160531_0234.py new file mode 100644 index 0000000..d4343da --- /dev/null +++ b/bikeshop_project/core/migrations/0012_auto_20160531_0234.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-31 02:34 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0011_auto_20160531_0233'), + ] + + operations = [ + migrations.RemoveField( + model_name='membership', + name='payment', + ), + migrations.AddField( + model_name='payment', + name='membership', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='core.Membership'), + ), + ] diff --git a/bikeshop_project/core/migrations/0013_auto_20160531_0236.py b/bikeshop_project/core/migrations/0013_auto_20160531_0236.py new file mode 100644 index 0000000..5dae435 --- /dev/null +++ b/bikeshop_project/core/migrations/0013_auto_20160531_0236.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-31 02:36 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0012_auto_20160531_0234'), + ] + + operations = [ + migrations.RemoveField( + model_name='payment', + name='membership', + ), + migrations.AddField( + model_name='membership', + name='payment', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='membership', to='core.Payment'), + ), + ] diff --git a/bikeshop_project/core/migrations/0014_payment_paid.py b/bikeshop_project/core/migrations/0014_payment_paid.py new file mode 100644 index 0000000..67223fe --- /dev/null +++ b/bikeshop_project/core/migrations/0014_payment_paid.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-31 02:38 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0013_auto_20160531_0236'), + ] + + operations = [ + migrations.AddField( + model_name='payment', + name='paid', + field=models.BooleanField(default=False), + ), + ] diff --git a/bikeshop_project/core/migrations/0015_auto_20160531_0413.py b/bikeshop_project/core/migrations/0015_auto_20160531_0413.py new file mode 100644 index 0000000..3e6bdc0 --- /dev/null +++ b/bikeshop_project/core/migrations/0015_auto_20160531_0413.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-31 04:13 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0014_payment_paid'), + ] + + operations = [ + migrations.AlterField( + model_name='payment', + name='type', + field=models.CharField(choices=[('CASH', 'cash'), ('CHEQUE', 'cheque'), ('VOLUNTEERING', 'volunteering'), ('STRIPE', 'stripe'), ('PAYPAL', 'paypal')], default='None', max_length=12), + ), + ] diff --git a/bikeshop_project/core/migrations/0016_auto_20160531_0416.py b/bikeshop_project/core/migrations/0016_auto_20160531_0416.py new file mode 100644 index 0000000..55ee7fc --- /dev/null +++ b/bikeshop_project/core/migrations/0016_auto_20160531_0416.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-05-31 04:16 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0015_auto_20160531_0413'), + ] + + operations = [ + migrations.RemoveField( + model_name='payment', + name='paid', + ), + migrations.AlterField( + model_name='payment', + name='type', + field=models.CharField(choices=[('NONE', 'None'), ('CASH', 'Cash'), ('CHEQUE', 'Cheque'), ('VOLUNTEERING', 'Volunteering'), ('STRIPE', 'Stripe'), ('PAYPAL', 'PayPal')], default='NONE', max_length=12), + ), + ] diff --git a/bikeshop_project/core/models.py b/bikeshop_project/core/models.py index fb9b364..828ea8c 100644 --- a/bikeshop_project/core/models.py +++ b/bikeshop_project/core/models.py @@ -6,34 +6,35 @@ class Membership(models.Model): created_at = models.DateTimeField(auto_now_add=True) modified_at = models.DateTimeField(auto_now=True) renewed_at = models.DateTimeField(default=timezone.now) - member = models.OneToOneField( - 'registration.Member', - on_delete=models.CASCADE, - related_name='membership' - ) - safe_space = models.BooleanField(default=False) - community = models.BooleanField(default=False) - give_back = models.BooleanField(default=False) - # this should be a form field that requires the new member to type out there full name - acknowledgement = models.BooleanField(default=False) self_identification = models.CharField(max_length=255, null=True, blank=True) gender = models.CharField(max_length=255, null=True, blank=True) involvement = models.CharField(max_length=255, null=True, blank=True) + member = models.ForeignKey( + 'registration.Member', + on_delete=models.CASCADE, + related_name='memberships', + blank=True, + null=True + ) + payment = models.OneToOneField( + 'Payment', + on_delete=models.CASCADE, + related_name='membership', + blank=False, + null=True + ) class Payment(models.Model): - membership = models.ForeignKey( - 'Membership', - on_delete=models.CASCADE, - ) payment_choices = ( - ('CASH', 'cash'), - ('CHEQUE', 'cheque'), - ('VOLUNTEERING', 'volunteering'), - ('STRIPE', 'stripe'), - ('PAYPAL', 'paypal') + ('NONE', 'None'), + ('CASH', 'Cash'), + ('CHEQUE', 'Cheque'), + ('VOLUNTEERING', 'Volunteering'), + ('STRIPE', 'Stripe'), + ('PAYPAL', 'PayPal') ) - type = models.CharField(max_length=12, choices=payment_choices) + type = models.CharField(max_length=12, choices=payment_choices, default='NONE') created_at = models.DateTimeField(auto_now_add=True) diff --git a/bikeshop_project/core/static/scss/screen.scss b/bikeshop_project/core/static/scss/screen.scss index 1bd2db5..3c91d7b 100644 --- a/bikeshop_project/core/static/scss/screen.scss +++ b/bikeshop_project/core/static/scss/screen.scss @@ -7,6 +7,7 @@ @import "vendor/material-design-lite/src/layout/layout"; @import "vendor/material-design-lite/src/footer/mega_footer"; @import "vendor/material-design-lite/src/checkbox/checkbox"; +@import "vendor/material-design-lite/src/radio/radio"; @import "vendor/material-design-lite/src/button/button"; @import "vendor/material-design-lite/src/palette/palette"; @import "vendor/material-design-lite/src/menu/menu"; diff --git a/bikeshop_project/core/templates/membership_form.html b/bikeshop_project/core/templates/membership_form.html new file mode 100644 index 0000000..df5d49a --- /dev/null +++ b/bikeshop_project/core/templates/membership_form.html @@ -0,0 +1,192 @@ +{% extends 'base.html' %} +{% load staticfiles %} + +{% block styles %} + +{% endblock %} + +{% block content %} +
+ The Bridge City Bicycle Co-operative (herein referred to as The BCBC and The Community) is a nonprofit, + community bicycle repair education and resource co-operative. We offer our members nonjudgmental repair + space, tools and instruction during business hours (hours on website) by donation, and educational + workshops. We also offer reconditioned/recycled low cost bikes and parts for sale. + The BCBC is operated by volunteers; a medley of professionals, students, bike enthusiasts, activists, + and other community members who share a love for cycling in Saskatoon. Membership is open to all + individuals and costs $20 per year. A receipt will be issued to you once your membership fee has been paid. +
+ +