Skip to content

Commit

Permalink
membership: pay membership fee with checkout
Browse files Browse the repository at this point in the history
  • Loading branch information
japsu committed Jul 23, 2020
1 parent 7c10c91 commit cdcddfe
Show file tree
Hide file tree
Showing 30 changed files with 626 additions and 221 deletions.
74 changes: 25 additions & 49 deletions core/admin.py
Expand Up @@ -4,29 +4,29 @@
from django.contrib.auth.admin import GroupAdmin
from django.contrib.auth.models import User, Group

from .models import Organization, Event, Person, Venue, CarouselSlide


organization_admin_inlines = []

if 'membership' in settings.INSTALLED_APPS:
from membership.admin import InlineMembershipOrganizationMetaAdmin
organization_admin_inlines.append(InlineMembershipOrganizationMetaAdmin)

if 'access' in settings.INSTALLED_APPS:
from access.admin import InlineAccessOrganizationMetaAdmin
organization_admin_inlines.append(InlineAccessOrganizationMetaAdmin)
from access.admin import InlineAccessOrganizationMetaAdmin
from badges.admin import InlineBadgesEventMetaAdmin
from directory.admin import InlineDirectoryOrganizationMetaAdmin
from enrollment.admin import InlineEnrollmentEventMetaAdmin
from intra.admin import InlineIntraEventMetaAdmin
from labour.admin import InlineLabourEventMetaAdmin
from membership.admin import InlineMembershipOrganizationMetaAdmin
from payments.admin import InlinePaymentsOrganizationMetaAdmin
from programme.admin import InlineProgrammeEventMetaAdmin
from tickets.admin import InlineTicketsEventMetaAdmin


if 'directory' in settings.INSTALLED_APPS:
from directory.admin import InlineDirectoryOrganizationMetaAdmin
organization_admin_inlines.append(InlineDirectoryOrganizationMetaAdmin)
from .models import Organization, Event, Person, Venue, CarouselSlide


class OrganizationAdmin(admin.ModelAdmin):
list_display = ('name', 'slug', 'homepage_url')
ordering = ('name',)
inlines = tuple(organization_admin_inlines)
inlines = (
InlineMembershipOrganizationMetaAdmin,
InlineAccessOrganizationMetaAdmin,
InlinePaymentsOrganizationMetaAdmin,
InlineDirectoryOrganizationMetaAdmin,
)


def merge_selected_people(modeladmin, request, queryset):
Expand Down Expand Up @@ -55,43 +55,19 @@ class PersonAdmin(admin.ModelAdmin):
actions = [merge_selected_people]


event_admin_inlines = []

if 'labour' in settings.INSTALLED_APPS:
from labour.admin import InlineLabourEventMetaAdmin
event_admin_inlines.append(InlineLabourEventMetaAdmin)

if 'programme' in settings.INSTALLED_APPS:
from programme.admin import InlineProgrammeEventMetaAdmin
event_admin_inlines.append(InlineProgrammeEventMetaAdmin)

if 'tickets' in settings.INSTALLED_APPS:
from tickets.admin import InlineTicketsEventMetaAdmin
event_admin_inlines.append(InlineTicketsEventMetaAdmin)

if 'payments' in settings.INSTALLED_APPS:
from payments.admin import InlinePaymentsEventMetaAdmin
event_admin_inlines.append(InlinePaymentsEventMetaAdmin)

if 'badges' in settings.INSTALLED_APPS:
from badges.admin import InlineBadgesEventMetaAdmin
event_admin_inlines.append(InlineBadgesEventMetaAdmin)

if 'enrollment' in settings.INSTALLED_APPS:
from enrollment.admin import InlineEnrollmentEventMetaAdmin
event_admin_inlines.append(InlineEnrollmentEventMetaAdmin)

if 'intra' in settings.INSTALLED_APPS:
from intra.admin import InlineIntraEventMetaAdmin
event_admin_inlines.append(InlineIntraEventMetaAdmin)


class EventAdmin(admin.ModelAdmin):
list_display = ('name', 'organization', 'venue', 'public', 'cancelled')
list_filter = ('organization', 'venue', 'public', 'cancelled')
search_fields = ('name',)

inlines = tuple(event_admin_inlines)
inlines = (
InlineLabourEventMetaAdmin,
InlineProgrammeEventMetaAdmin,
InlineTicketsEventMetaAdmin,
InlineBadgesEventMetaAdmin,
InlineEnrollmentEventMetaAdmin,
InlineIntraEventMetaAdmin,
)

fieldsets = (
('Tapahtuman nimi', dict(fields=(
Expand Down
1 change: 0 additions & 1 deletion core/models/event.py
Expand Up @@ -213,7 +213,6 @@ def either_logo_url(self):
programme_event_meta = event_meta_property('programme')
badges_event_meta = event_meta_property('badges')
tickets_event_meta = event_meta_property('tickets')
payments_event_meta = event_meta_property('payments')
sms_event_meta = event_meta_property('sms')
enrollment_event_meta = event_meta_property('enrollment')
intra_event_meta = event_meta_property('intra')
Expand Down
18 changes: 9 additions & 9 deletions core/models/organization.py
Expand Up @@ -65,9 +65,6 @@ def get_or_create_dummy(cls):

@property
def membership_organization_meta(self):
if 'membership' not in settings.INSTALLED_APPS:
return None

from membership.models import MembershipOrganizationMeta

try:
Expand All @@ -77,9 +74,6 @@ def membership_organization_meta(self):

@property
def access_organization_meta(self):
if 'access' not in settings.INSTALLED_APPS:
return None

from access.models import AccessOrganizationMeta

try:
Expand All @@ -89,16 +83,22 @@ def access_organization_meta(self):

@property
def directory_organization_meta(self):
if 'directory' not in settings.INSTALLED_APPS:
return None

from directory.models import DirectoryOrganizationMeta

try:
return self.directoryorganizationmeta
except DirectoryOrganizationMeta.DoesNotExist:
return None

@property
def payments_organization_meta(self):
from payments.models import PaymentsOrganizationMeta

try:
return self.paymentsorganizationmeta
except PaymentsOrganizationMeta.DoesNotExist:
return None

@property
def people(self):
"""
Expand Down
5 changes: 5 additions & 0 deletions core/views/public_views.py
Expand Up @@ -9,6 +9,10 @@
from django.utils.timezone import now
from django.views.decorators.http import require_http_methods, require_safe

from csp.decorators import csp_update

from payments.models import CHECKOUT_PAYMENT_WALL_ORIGIN

from ..models import (
EmailVerificationError,
EmailVerificationToken,
Expand Down Expand Up @@ -36,6 +40,7 @@


@public_organization_required
@csp_update(FORM_ACTION=CHECKOUT_PAYMENT_WALL_ORIGIN)
def core_organization_view(request, organization):
t = now()

Expand Down
18 changes: 18 additions & 0 deletions events/tracon2019/migrations/0004_auto_20200723_1925.py
@@ -0,0 +1,18 @@
# Generated by Django 2.2.10 on 2020-07-23 16:25

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('tracon2019', '0003_auto_20190910_1347'),
]

operations = [
migrations.AlterField(
model_name='signupextra',
name='afterparty_help',
field=models.TextField(blank=True, default='', help_text='Oletko valmis auttamaan kaadon järjestelyissä, esim. logistiikassa, roudauksessa tai juomien kaatamisessa? Jos olet, kirjoita tähän, millaisia hommia olisit valmis tekemään ja kuinka paljon (karkea tuntimäärä illan aikana).', verbose_name='Työskentely kaatajaisissa'),
),
]
Expand Up @@ -36,16 +36,16 @@ def handle(self, *args, **opts):
tickets_admin_group, pos_access_group = TicketsEventMeta.get_or_create_groups(event, ['admins', 'pos'])
payments_admin_group, = PaymentsEventMeta.get_or_create_groups(event, ['admins'])

tracon_payments = PaymentsEventMeta.objects.get(event__slug='tracon2019')
PaymentsEventMeta.objects.get_or_create(
event=event,
defaults=dict(
admin_group=payments_admin_group,
checkout_delivery_date='20190906',
checkout_merchant=tracon_payments.checkout_merchant,
checkout_password=tracon_payments.checkout_password,
),
)
# tracon_payments = PaymentsEventMeta.objects.get(event__slug='tracon2019')
# PaymentsEventMeta.objects.get_or_create(
# event=event,
# defaults=dict(
# admin_group=payments_admin_group,
# checkout_delivery_date='20190906',
# checkout_merchant=tracon_payments.checkout_merchant,
# checkout_password=tracon_payments.checkout_password,
# ),
# )

defaults = dict(
admin_group=tickets_admin_group,
Expand Down
2 changes: 1 addition & 1 deletion membership/admin.py
Expand Up @@ -33,7 +33,7 @@ class TermAdmin(admin.ModelAdmin):


class MembershipFeePaymentAdmin(admin.ModelAdmin):
list_display = ('admin_get_organization', 'term', 'admin_get_official_name', 'payment_date')
list_display = ('admin_get_organization', 'term', 'admin_get_official_name', 'admin_get_formatted_amount', 'admin_is_paid', 'payment_date')
list_filter = ('term__organization',)
ordering = ('term__organization', 'member__person__surname', 'member__person__official_first_names')

Expand Down
25 changes: 14 additions & 11 deletions membership/forms.py
Expand Up @@ -71,24 +71,27 @@ class Meta:

class MembershipFeePaymentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
current_term = kwargs.pop('current_term')
initial = kwargs.setdefault('initial', {})
initial.update(
term=current_term.id,
amount_cents=current_term.membership_fee_cents,
payment_type='membership_fee',
)

super().__init__(*args, **kwargs)

self.fields['term'].queryset = current_term.organization.terms.all()
term = self.instance.term

class Meta:
model = MembershipFeePayment
fields = ('term', 'payment_type', 'payment_method', 'amount_cents')
fields = ('payment_type', 'payment_method', 'payment_date', 'amount_cents')


class TermForm(forms.ModelForm):
class Meta:
model = Term
fields = ('title', 'start_date', 'end_date', 'entrance_fee_cents', 'membership_fee_cents')
# TODO: support entrance_fee_cents
fields = ('title', 'start_date', 'end_date', 'membership_fee_cents', 'payment_method')

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

if not (self.instance.organization.payments_organization_meta):
# if not chekkout, get the hekk out
self.fields['payment_method'].choices = [
(key, label) for (key, label) in self.fields['payment_method'].choices
if key != 'checkout'
]
28 changes: 28 additions & 0 deletions membership/helpers.py
Expand Up @@ -3,6 +3,10 @@
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect

from core.helpers import person_required

from .models import Membership


def membership_admin_required(view_func):
@wraps(view_func)
Expand Down Expand Up @@ -45,3 +49,27 @@ def wrapper(request, organization_slug, *args, **kwargs):

return view_func(request, organization, *args, **kwargs)
return wrapper


def membership_required(view_func):
@wraps(view_func)
@person_required
def wrapper(request, organization_slug, *args, **kwargs):
from core.models import Organization

organization = get_object_or_404(Organization, slug=organization_slug)
meta = organization.membership_organization_meta

if not meta:
messages.error(request, "Tämä organisaatio ei käytä Kompassia jäsenrekisterin hallintaan.")
return redirect('core_organization_view', organization.slug)

try:
membership = Membership.objects.get(organization=organization, person=request.user.person)
except Membership.DoesNotExist:
messages.error(request, "Et ole tämän organisaation jäsen.")
return redirect('core_organization_view', organization.slug)

return view_func(request, membership, *args, **kwargs)

return wrapper
78 changes: 78 additions & 0 deletions membership/migrations/0016_auto_20200723_1912.py
@@ -0,0 +1,78 @@
# Generated by Django 2.2.10 on 2020-07-23 16:12

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('core', '0034_event_cancelled'),
('membership', '0015_auto_20190921_1449'),
]

operations = [
migrations.AddField(
model_name='membership',
name='created_at',
field=models.DateTimeField(auto_now_add=True, null=True),
),
migrations.AddField(
model_name='membership',
name='updated_at',
field=models.DateTimeField(auto_now=True, null=True),
),
migrations.AddField(
model_name='membershipfeepayment',
name='reference_number',
field=models.CharField(blank=True, db_index=True, max_length=31, verbose_name='Viitenumero'),
),
migrations.AddField(
model_name='term',
name='reference_number_template',
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name='membershipfeepayment',
name='amount_cents',
field=models.PositiveIntegerField(help_text='TODO vaihda kälissä euroiks', verbose_name='Maksettu summa (snt)'),
),
migrations.AlterField(
model_name='membershipfeepayment',
name='payment_date',
field=models.DateField(blank=True, help_text='Jos maksupäivä on asetettu, jäsenmaksu näkyy maksettuna. Jätä jäsenmaksu tyhjäksi jos haluat nollata maksetun jäsenmaksun.', null=True, verbose_name='Maksupäivä'),
),
migrations.AlterField(
model_name='membershipfeepayment',
name='payment_method',
field=models.CharField(choices=[('bank_transfer', 'Tilisiirto'), ('checkout', 'Checkout Finland')], default='bank_transfer', max_length=13, verbose_name='Maksutapa'),
),
migrations.AlterField(
model_name='membershipfeepayment',
name='payment_type',
field=models.CharField(choices=[('membership_fee_with_entrance_fee', 'Liittymismaksu ja jäsenmaksu'), ('membership_fee', 'Jäsenmaksu')], default='membership_fee', max_length=32, verbose_name='Maksun tyyppi'),
),
migrations.AlterField(
model_name='membershipfeepayment',
name='term',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='membership_fee_payments', to='membership.Term', verbose_name='Toimikausi'),
),
migrations.AlterField(
model_name='term',
name='entrance_fee_cents',
field=models.PositiveIntegerField(blank=True, default=0, help_text='Arvo 0 (nolla senttiä) tarkoittaa, että yhdistyksellä ei ole tällä kaudella liittymismaksua. Arvon puuttuminen tarkoittaa, että liittymismaksu ei ole tiedossa. (TODO: Se, että jäsenmaksut esitetään tässä sentteinä eikä euroina, on tiedostettu puute joka korjataan… joskus. Siihen asti kerro euromääräinen jäsenmaksu 100:lla.)', null=True, verbose_name='Liittymismaksu (snt)'),
),
migrations.AlterField(
model_name='term',
name='payment_method',
field=models.CharField(choices=[('bank_transfer', 'Tilisiirto'), ('checkout', 'Checkout Finland')], default='bank_transfer', max_length=13, verbose_name='Maksutapa'),
),
migrations.AlterUniqueTogether(
name='membership',
unique_together={('organization', 'person')},
),
migrations.AlterUniqueTogether(
name='membershipfeepayment',
unique_together={('term', 'member')},
),
]

0 comments on commit cdcddfe

Please sign in to comment.