mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 01:12:08 +01:00 
			
		
		
		
	Not so atomic, sorry
This commit is contained in:
		@@ -1,11 +1,14 @@
 | 
				
			|||||||
[run]
 | 
					[run]
 | 
				
			||||||
source =
 | 
					source =
 | 
				
			||||||
    adherents
 | 
					    activity
 | 
				
			||||||
 | 
					    member
 | 
				
			||||||
    note
 | 
					    note
 | 
				
			||||||
    theme
 | 
					    theme
 | 
				
			||||||
omit =
 | 
					omit =
 | 
				
			||||||
    adherents/tests/*.py
 | 
					    activity/tests/*.py
 | 
				
			||||||
    adherents/migrations/*.py
 | 
					    activity/migrations/*.py
 | 
				
			||||||
 | 
					    member/tests/*.py
 | 
				
			||||||
 | 
					    member/migrations/*.py
 | 
				
			||||||
    note/tests/*.py
 | 
					    note/tests/*.py
 | 
				
			||||||
    note/migrations/*.py
 | 
					    note/migrations/*.py
 | 
				
			||||||
    theme/tests/*.py
 | 
					    theme/tests/*.py
 | 
				
			||||||
@@ -2,4 +2,4 @@
 | 
				
			|||||||
# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
default_app_config = 'adherents.apps.AdherentsConfig'
 | 
					default_app_config = 'activity.apps.ActivityConfig'
 | 
				
			||||||
							
								
								
									
										3
									
								
								activity/admin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								activity/admin.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
@@ -6,6 +6,6 @@ from django.apps import AppConfig
 | 
				
			|||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AdherentsConfig(AppConfig):
 | 
					class ActivityConfig(AppConfig):
 | 
				
			||||||
    name = 'adherents'
 | 
					    name = 'activity'
 | 
				
			||||||
    verbose_name = _('adherents')
 | 
					    verbose_name = _('activity')
 | 
				
			||||||
							
								
								
									
										54
									
								
								activity/locale/fr/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								activity/locale/fr/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					#, fuzzy
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
 | 
					"POT-Creation-Date: 2019-07-16 12:37+0200\n"
 | 
				
			||||||
 | 
					"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
				
			||||||
 | 
					"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
				
			||||||
 | 
					"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
				
			||||||
 | 
					"Language: \n"
 | 
				
			||||||
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
 | 
					"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: apps.py:11
 | 
				
			||||||
 | 
					msgid "activity"
 | 
				
			||||||
 | 
					msgstr "activité"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:12 models.py:25
 | 
				
			||||||
 | 
					msgid "name"
 | 
				
			||||||
 | 
					msgstr "nom"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:16
 | 
				
			||||||
 | 
					msgid "can invite"
 | 
				
			||||||
 | 
					msgstr "peut inviter"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:19
 | 
				
			||||||
 | 
					msgid "guest entry fee"
 | 
				
			||||||
 | 
					msgstr "cotisation de l'entrée invité"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:29
 | 
				
			||||||
 | 
					msgid "description"
 | 
				
			||||||
 | 
					msgstr "description"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:35
 | 
				
			||||||
 | 
					msgid "type"
 | 
				
			||||||
 | 
					msgstr "type"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:41
 | 
				
			||||||
 | 
					msgid "organizer"
 | 
				
			||||||
 | 
					msgstr "organisateur"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:47
 | 
				
			||||||
 | 
					msgid "attendees club"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:50
 | 
				
			||||||
 | 
					msgid "start date"
 | 
				
			||||||
 | 
					msgstr "date de début"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:53
 | 
				
			||||||
 | 
					msgid "end date"
 | 
				
			||||||
 | 
					msgstr "date de fin"
 | 
				
			||||||
							
								
								
									
										64
									
								
								activity/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								activity/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					# Generated by Django 2.2.3 on 2019-07-16 10:33
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.db import migrations, models
 | 
				
			||||||
 | 
					import django.db.models.deletion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    initial = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dependencies = [
 | 
				
			||||||
 | 
					        ('note', '0001_initial'),
 | 
				
			||||||
 | 
					        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 | 
				
			||||||
 | 
					        ('member', '0001_initial'),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    operations = [
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='Activity',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
 | 
					                ('name', models.CharField(max_length=255, verbose_name='name')),
 | 
				
			||||||
 | 
					                ('description', models.TextField(verbose_name='description')),
 | 
				
			||||||
 | 
					                ('date_start', models.DateTimeField(verbose_name='start date')),
 | 
				
			||||||
 | 
					                ('date_end', models.DateTimeField(verbose_name='end date')),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='ActivityType',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
 | 
					                ('name', models.CharField(max_length=255, verbose_name='name')),
 | 
				
			||||||
 | 
					                ('can_invite', models.BooleanField(verbose_name='can invite')),
 | 
				
			||||||
 | 
					                ('guest_entry_fee', models.PositiveIntegerField(verbose_name='guest entry fee')),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='Guest',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
 | 
					                ('name', models.CharField(max_length=255)),
 | 
				
			||||||
 | 
					                ('entry', models.DateTimeField(null=True)),
 | 
				
			||||||
 | 
					                ('activity', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='activity.Activity')),
 | 
				
			||||||
 | 
					                ('entry_transaction', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='note.Transaction')),
 | 
				
			||||||
 | 
					                ('inviter', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL)),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.AddField(
 | 
				
			||||||
 | 
					            model_name='activity',
 | 
				
			||||||
 | 
					            name='activity_type',
 | 
				
			||||||
 | 
					            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='activity.ActivityType', verbose_name='type'),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.AddField(
 | 
				
			||||||
 | 
					            model_name='activity',
 | 
				
			||||||
 | 
					            name='attendees_club',
 | 
				
			||||||
 | 
					            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='member.Club', verbose_name='attendees club'),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.AddField(
 | 
				
			||||||
 | 
					            model_name='activity',
 | 
				
			||||||
 | 
					            name='organizer',
 | 
				
			||||||
 | 
					            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='member.Club', verbose_name='organizer'),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
							
								
								
									
										77
									
								
								activity/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								activity/models.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.db import models
 | 
				
			||||||
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ActivityType(models.Model):
 | 
				
			||||||
 | 
					    name = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('name'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    can_invite = models.BooleanField(
 | 
				
			||||||
 | 
					        verbose_name=_('can invite'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    guest_entry_fee = models.PositiveIntegerField(
 | 
				
			||||||
 | 
					        verbose_name=_('guest entry fee'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Activity(models.Model):
 | 
				
			||||||
 | 
					    name = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('name'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    description = models.TextField(
 | 
				
			||||||
 | 
					        verbose_name=_('description'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    activity_type = models.ForeignKey(
 | 
				
			||||||
 | 
					        ActivityType,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					        verbose_name=_('type'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    organizer = models.ForeignKey(
 | 
				
			||||||
 | 
					        'member.Club',
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					        verbose_name=_('organizer'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    attendees_club = models.ForeignKey(
 | 
				
			||||||
 | 
					        'member.Club',
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					        verbose_name=_('attendees club'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    date_start = models.DateTimeField(
 | 
				
			||||||
 | 
					        verbose_name=_('start date'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    date_end = models.DateTimeField(
 | 
				
			||||||
 | 
					        verbose_name=_('end date'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Guest(models.Model):
 | 
				
			||||||
 | 
					    activity = models.ForeignKey(
 | 
				
			||||||
 | 
					        Activity,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    name = models.CharField(
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    inviter = models.ForeignKey(
 | 
				
			||||||
 | 
					        settings.AUTH_USER_MODEL,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    entry = models.DateTimeField(
 | 
				
			||||||
 | 
					        null=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    entry_transaction = models.ForeignKey(
 | 
				
			||||||
 | 
					        'note.Transaction',
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
@@ -1,51 +0,0 @@
 | 
				
			|||||||
# SOME DESCRIPTIVE TITLE.
 | 
					 | 
				
			||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 | 
					 | 
				
			||||||
# This file is distributed under the same license as the PACKAGE package.
 | 
					 | 
				
			||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#, fuzzy
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					 | 
				
			||||||
"POT-Creation-Date: 2019-07-08 13:45+0200\n"
 | 
					 | 
				
			||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
					 | 
				
			||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
					 | 
				
			||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
					 | 
				
			||||||
"Language: \n"
 | 
					 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					 | 
				
			||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:26
 | 
					 | 
				
			||||||
msgid "phone number"
 | 
					 | 
				
			||||||
msgstr "numéro de téléphone"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:30
 | 
					 | 
				
			||||||
msgid "section"
 | 
					 | 
				
			||||||
msgstr "section"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:31
 | 
					 | 
				
			||||||
msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
 | 
					 | 
				
			||||||
msgstr "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:35 models.py:36
 | 
					 | 
				
			||||||
msgid "user profile"
 | 
					 | 
				
			||||||
msgstr "profil utilisateur"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:52
 | 
					 | 
				
			||||||
msgid "date"
 | 
					 | 
				
			||||||
msgstr "date"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:57
 | 
					 | 
				
			||||||
msgid "amount"
 | 
					 | 
				
			||||||
msgstr "montant"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:61
 | 
					 | 
				
			||||||
msgid "membership fee"
 | 
					 | 
				
			||||||
msgstr "cotisation"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: models.py:62
 | 
					 | 
				
			||||||
msgid "membership fees"
 | 
					 | 
				
			||||||
msgstr "cotisations"
 | 
					 | 
				
			||||||
@@ -1,49 +0,0 @@
 | 
				
			|||||||
# Generated by Django 2.2.3 on 2019-07-16 07:17
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from django.conf import settings
 | 
					 | 
				
			||||||
from django.db import migrations, models
 | 
					 | 
				
			||||||
import django.db.models.deletion
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Migration(migrations.Migration):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    initial = True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dependencies = [
 | 
					 | 
				
			||||||
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    operations = [
 | 
					 | 
				
			||||||
        migrations.CreateModel(
 | 
					 | 
				
			||||||
            name='Profile',
 | 
					 | 
				
			||||||
            fields=[
 | 
					 | 
				
			||||||
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
					 | 
				
			||||||
                ('avatar', models.ImageField(blank=True, max_length=255, upload_to='', verbose_name='profile picture')),
 | 
					 | 
				
			||||||
                ('phone_number', models.CharField(blank=True, default='', max_length=50, null=True, verbose_name='phone number')),
 | 
					 | 
				
			||||||
                ('section', models.CharField(help_text='e.g. "1A0", "9A♥", "SAPHIRE"', max_length=255, verbose_name='section')),
 | 
					 | 
				
			||||||
                ('genre', models.CharField(blank=True, choices=[(None, 'ND'), ('M', 'M'), ('F', 'F')], max_length=1, null=True)),
 | 
					 | 
				
			||||||
                ('address', models.TextField(blank=True, null=True)),
 | 
					 | 
				
			||||||
                ('paid', models.BooleanField(default=False, verbose_name='paid')),
 | 
					 | 
				
			||||||
                ('is_active', models.BooleanField(default=True, verbose_name='is active')),
 | 
					 | 
				
			||||||
                ('is_deleted', models.BooleanField(default=False, verbose_name='is deleted')),
 | 
					 | 
				
			||||||
                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
            options={
 | 
					 | 
				
			||||||
                'verbose_name': 'user profile',
 | 
					 | 
				
			||||||
                'verbose_name_plural': 'user profile',
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        ),
 | 
					 | 
				
			||||||
        migrations.CreateModel(
 | 
					 | 
				
			||||||
            name='MembershipFee',
 | 
					 | 
				
			||||||
            fields=[
 | 
					 | 
				
			||||||
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
					 | 
				
			||||||
                ('date', models.DateField(max_length=255, verbose_name='date')),
 | 
					 | 
				
			||||||
                ('amount', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='amount')),
 | 
					 | 
				
			||||||
                ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
            options={
 | 
					 | 
				
			||||||
                'verbose_name': 'membership fee',
 | 
					 | 
				
			||||||
                'verbose_name_plural': 'membership fees',
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        ),
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
@@ -1,105 +0,0 @@
 | 
				
			|||||||
# -*- mode: python; coding: utf-8 -*-
 | 
					 | 
				
			||||||
# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
					 | 
				
			||||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from django.conf import settings
 | 
					 | 
				
			||||||
from django.contrib.auth.models import User
 | 
					 | 
				
			||||||
from django.db import models
 | 
					 | 
				
			||||||
from django.db.models.signals import post_save
 | 
					 | 
				
			||||||
from django.dispatch import receiver
 | 
					 | 
				
			||||||
from django.utils.translation import gettext_lazy as _
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Profile(models.Model):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    An user profile
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    We do not want to patch the Django Contrib Auth User class
 | 
					 | 
				
			||||||
    so this model add an user profile with additional information.
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    GENRES = [
 | 
					 | 
				
			||||||
        (None, "ND"),
 | 
					 | 
				
			||||||
        ("M", "M"),
 | 
					 | 
				
			||||||
        ("F", "F"),
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    user = models.OneToOneField(
 | 
					 | 
				
			||||||
        settings.AUTH_USER_MODEL,
 | 
					 | 
				
			||||||
        on_delete=models.CASCADE,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    avatar = models.ImageField(
 | 
					 | 
				
			||||||
        max_length=255,
 | 
					 | 
				
			||||||
        blank=True,
 | 
					 | 
				
			||||||
        verbose_name=_('profile picture'),
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    phone_number = models.CharField(
 | 
					 | 
				
			||||||
        max_length=50,
 | 
					 | 
				
			||||||
        blank=True,
 | 
					 | 
				
			||||||
        null=True,
 | 
					 | 
				
			||||||
        default='',
 | 
					 | 
				
			||||||
        verbose_name=_('phone number'),
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    section = models.CharField(
 | 
					 | 
				
			||||||
        max_length=255,
 | 
					 | 
				
			||||||
        verbose_name=_('section'),
 | 
					 | 
				
			||||||
        help_text=_('e.g. "1A0", "9A♥", "SAPHIRE"'),
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    genre = models.CharField(
 | 
					 | 
				
			||||||
        max_length=1,
 | 
					 | 
				
			||||||
        blank=True,
 | 
					 | 
				
			||||||
        null=True,
 | 
					 | 
				
			||||||
        choices=GENRES,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    address = models.TextField(
 | 
					 | 
				
			||||||
        blank=True,
 | 
					 | 
				
			||||||
        null=True,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    paid = models.BooleanField(
 | 
					 | 
				
			||||||
        verbose_name=_("paid"),
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    is_active = models.BooleanField(
 | 
					 | 
				
			||||||
        verbose_name=_("is active"),
 | 
					 | 
				
			||||||
        default=True,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    is_deleted = models.BooleanField(
 | 
					 | 
				
			||||||
        verbose_name=_("is deleted"),
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    class Meta:
 | 
					 | 
				
			||||||
        verbose_name = _('user profile')
 | 
					 | 
				
			||||||
        verbose_name_plural = _('user profile')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class MembershipFee(models.Model):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    User can become member by paying a membership fee
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    user = models.ForeignKey(
 | 
					 | 
				
			||||||
        settings.AUTH_USER_MODEL,
 | 
					 | 
				
			||||||
        on_delete=models.PROTECT,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    date = models.DateField(
 | 
					 | 
				
			||||||
        max_length=255,
 | 
					 | 
				
			||||||
        verbose_name=_('date'),
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    amount = models.DecimalField(
 | 
					 | 
				
			||||||
        max_digits=5,  # Max 999.99 €
 | 
					 | 
				
			||||||
        decimal_places=2,
 | 
					 | 
				
			||||||
        verbose_name=_('amount'),
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    class Meta:
 | 
					 | 
				
			||||||
        verbose_name = _('membership fee')
 | 
					 | 
				
			||||||
        verbose_name_plural = _('membership fees')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@receiver(post_save, sender=User)
 | 
					 | 
				
			||||||
def save_user_profile(instance, created, **_kwargs):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Hook to save an user profile when an user is updated
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    if created:
 | 
					 | 
				
			||||||
        Profile.objects.create(user=instance)
 | 
					 | 
				
			||||||
    instance.profile.save()
 | 
					 | 
				
			||||||
							
								
								
									
										5
									
								
								member/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								member/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					default_app_config = 'member.apps.MemberConfig'
 | 
				
			||||||
							
								
								
									
										11
									
								
								member/apps.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								member/apps.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.apps import AppConfig
 | 
				
			||||||
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MemberConfig(AppConfig):
 | 
				
			||||||
 | 
					    name = 'member'
 | 
				
			||||||
 | 
					    verbose_name = _('member')
 | 
				
			||||||
							
								
								
									
										119
									
								
								member/locale/fr/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								member/locale/fr/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
				
			|||||||
 | 
					# SOME DESCRIPTIVE TITLE.
 | 
				
			||||||
 | 
					# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 | 
				
			||||||
 | 
					# This file is distributed under the same license as the PACKAGE package.
 | 
				
			||||||
 | 
					# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#, fuzzy
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
 | 
					"POT-Creation-Date: 2019-07-16 12:37+0200\n"
 | 
				
			||||||
 | 
					"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
				
			||||||
 | 
					"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
				
			||||||
 | 
					"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
				
			||||||
 | 
					"Language: \n"
 | 
				
			||||||
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
 | 
					"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: apps.py:11
 | 
				
			||||||
 | 
					msgid "member"
 | 
				
			||||||
 | 
					msgstr "adhérent"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:24
 | 
				
			||||||
 | 
					msgid "profile picture"
 | 
				
			||||||
 | 
					msgstr "image de profil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:29
 | 
				
			||||||
 | 
					msgid "phone number"
 | 
				
			||||||
 | 
					msgstr "numéro de téléphone"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:36
 | 
				
			||||||
 | 
					msgid "section"
 | 
				
			||||||
 | 
					msgstr "section"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:37
 | 
				
			||||||
 | 
					msgid "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
 | 
				
			||||||
 | 
					msgstr "e.g. \"1A0\", \"9A♥\", \"SAPHIRE\""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:41
 | 
				
			||||||
 | 
					msgid "address"
 | 
				
			||||||
 | 
					msgstr "adresse"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:47 models.py:61
 | 
				
			||||||
 | 
					msgid "paid"
 | 
				
			||||||
 | 
					msgstr "payé"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:52 models.py:53
 | 
				
			||||||
 | 
					msgid "user profile"
 | 
				
			||||||
 | 
					msgstr "profil utilisateur"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:65
 | 
				
			||||||
 | 
					msgid "email"
 | 
				
			||||||
 | 
					msgstr "courriel"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:70
 | 
				
			||||||
 | 
					msgid "membership fee"
 | 
				
			||||||
 | 
					msgstr "cotisation"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:74
 | 
				
			||||||
 | 
					msgid "membership duration"
 | 
				
			||||||
 | 
					msgstr "durée de l'adhésion"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:75
 | 
				
			||||||
 | 
					msgid "The longest time a membership can last (NULL = infinite)."
 | 
				
			||||||
 | 
					msgstr "La durée maximale d'une adhésion (NULL = infinie)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:79
 | 
				
			||||||
 | 
					msgid "membership start"
 | 
				
			||||||
 | 
					msgstr "début de l'adhésion"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:80
 | 
				
			||||||
 | 
					msgid "How long after January 1st the members can renew their membership."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:84
 | 
				
			||||||
 | 
					msgid "membership end"
 | 
				
			||||||
 | 
					msgstr "fin de l'adhésion"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:85
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How long the membership can last after January 1st of the next year after "
 | 
				
			||||||
 | 
					"members can renew their membership."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:95
 | 
				
			||||||
 | 
					msgid "name"
 | 
				
			||||||
 | 
					msgstr "nom"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:100
 | 
				
			||||||
 | 
					msgid "role"
 | 
				
			||||||
 | 
					msgstr "rôle"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:101
 | 
				
			||||||
 | 
					msgid "roles"
 | 
				
			||||||
 | 
					msgstr "rôles"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:118
 | 
				
			||||||
 | 
					msgid "membership starts on"
 | 
				
			||||||
 | 
					msgstr "l'adhésion commence le"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:121
 | 
				
			||||||
 | 
					#, fuzzy
 | 
				
			||||||
 | 
					#| msgid "membership fees"
 | 
				
			||||||
 | 
					msgid "membership ends on"
 | 
				
			||||||
 | 
					msgstr "l'adhésion finie le"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:125
 | 
				
			||||||
 | 
					msgid "fee"
 | 
				
			||||||
 | 
					msgstr "cotisation"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:129
 | 
				
			||||||
 | 
					msgid "membership"
 | 
				
			||||||
 | 
					msgstr "adhésion"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models.py:130
 | 
				
			||||||
 | 
					msgid "memberships"
 | 
				
			||||||
 | 
					msgstr "adhésions"
 | 
				
			||||||
							
								
								
									
										72
									
								
								member/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								member/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					# Generated by Django 2.2.3 on 2019-07-16 10:33
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.db import migrations, models
 | 
				
			||||||
 | 
					import django.db.models.deletion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    initial = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dependencies = [
 | 
				
			||||||
 | 
					        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    operations = [
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='Club',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
 | 
					                ('name', models.CharField(max_length=255, verbose_name='paid')),
 | 
				
			||||||
 | 
					                ('email', models.EmailField(max_length=254, verbose_name='email')),
 | 
				
			||||||
 | 
					                ('membership_fee', models.PositiveIntegerField(verbose_name='membership fee')),
 | 
				
			||||||
 | 
					                ('membership_duration', models.DurationField(help_text='The longest time a membership can last (NULL = infinite).', null=True, verbose_name='membership duration')),
 | 
				
			||||||
 | 
					                ('membership_start', models.DurationField(help_text='How long after January 1st the members can renew their membership.', null=True, verbose_name='membership start')),
 | 
				
			||||||
 | 
					                ('membership_end', models.DurationField(help_text='How long the membership can last after January 1st of the next year after members can renew their membership.', null=True, verbose_name='membership end')),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='Role',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
 | 
					                ('name', models.CharField(max_length=255, verbose_name='name')),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            options={
 | 
				
			||||||
 | 
					                'verbose_name': 'role',
 | 
				
			||||||
 | 
					                'verbose_name_plural': 'roles',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='Profile',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
 | 
					                ('profile_picture', models.ImageField(blank=True, max_length=255, upload_to='', verbose_name='profile picture')),
 | 
				
			||||||
 | 
					                ('phone_number', models.CharField(blank=True, default='', max_length=50, null=True, verbose_name='phone number')),
 | 
				
			||||||
 | 
					                ('section', models.CharField(help_text='e.g. "1A0", "9A♥", "SAPHIRE"', max_length=255, verbose_name='section')),
 | 
				
			||||||
 | 
					                ('address', models.CharField(blank=True, max_length=255, null=True, verbose_name='address')),
 | 
				
			||||||
 | 
					                ('paid', models.BooleanField(default=False, verbose_name='paid')),
 | 
				
			||||||
 | 
					                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            options={
 | 
				
			||||||
 | 
					                'verbose_name': 'user profile',
 | 
				
			||||||
 | 
					                'verbose_name_plural': 'user profile',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='Membership',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
 | 
					                ('date_start', models.DateField(verbose_name='membership starts on')),
 | 
				
			||||||
 | 
					                ('date_end', models.DateField(null=True, verbose_name='membership ends on')),
 | 
				
			||||||
 | 
					                ('fee', models.PositiveIntegerField(verbose_name='fee')),
 | 
				
			||||||
 | 
					                ('club', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='member.Club')),
 | 
				
			||||||
 | 
					                ('roles', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='member.Role')),
 | 
				
			||||||
 | 
					                ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            options={
 | 
				
			||||||
 | 
					                'verbose_name': 'membership',
 | 
				
			||||||
 | 
					                'verbose_name_plural': 'memberships',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
							
								
								
									
										0
									
								
								member/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								member/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										140
									
								
								member/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								member/models.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,140 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.db import models
 | 
				
			||||||
 | 
					from django.db.models.signals import post_save
 | 
				
			||||||
 | 
					from django.dispatch import receiver
 | 
				
			||||||
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Profile(models.Model):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    An user profile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    We do not want to patch the Django Contrib Auth User class
 | 
				
			||||||
 | 
					    so this model add an user profile with additional information.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    user = models.OneToOneField(
 | 
				
			||||||
 | 
					        settings.AUTH_USER_MODEL,
 | 
				
			||||||
 | 
					        on_delete=models.CASCADE,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    profile_picture = models.ImageField(
 | 
				
			||||||
 | 
					        verbose_name=_('profile picture'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					        blank=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    phone_number = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('phone number'),
 | 
				
			||||||
 | 
					        max_length=50,
 | 
				
			||||||
 | 
					        blank=True,
 | 
				
			||||||
 | 
					        null=True,
 | 
				
			||||||
 | 
					        default='',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    section = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('section'),
 | 
				
			||||||
 | 
					        help_text=_('e.g. "1A0", "9A♥", "SAPHIRE"'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    address = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('address'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					        blank=True,
 | 
				
			||||||
 | 
					        null=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    paid = models.BooleanField(
 | 
				
			||||||
 | 
					        verbose_name=_("paid"),
 | 
				
			||||||
 | 
					        default=False,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        verbose_name = _('user profile')
 | 
				
			||||||
 | 
					        verbose_name_plural = _('user profile')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Club(models.Model):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    A student club
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    name = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('paid'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    email = models.EmailField(
 | 
				
			||||||
 | 
					        verbose_name=_('email'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Memberships
 | 
				
			||||||
 | 
					    membership_fee = models.PositiveIntegerField(
 | 
				
			||||||
 | 
					        verbose_name=_('membership fee'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    membership_duration = models.DurationField(
 | 
				
			||||||
 | 
					        null=True,
 | 
				
			||||||
 | 
					        verbose_name=_('membership duration'),
 | 
				
			||||||
 | 
					        help_text=_('The longest time a membership can last (NULL = infinite).'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    membership_start = models.DurationField(
 | 
				
			||||||
 | 
					        null=True,
 | 
				
			||||||
 | 
					        verbose_name=_('membership start'),
 | 
				
			||||||
 | 
					        help_text=_('How long after January 1st the members can renew their membership.'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    membership_end = models.DurationField(
 | 
				
			||||||
 | 
					        null=True,
 | 
				
			||||||
 | 
					        verbose_name=_('membership end'),
 | 
				
			||||||
 | 
					        help_text=_('How long the membership can last after January 1st of the next year '
 | 
				
			||||||
 | 
					                    'after members can renew their membership.'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Role(models.Model):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Role that an user can have in a club
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    name = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('name'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        verbose_name = _('role')
 | 
				
			||||||
 | 
					        verbose_name_plural = _('roles')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Membership(models.Model):
 | 
				
			||||||
 | 
					    user = models.ForeignKey(
 | 
				
			||||||
 | 
					        settings.AUTH_USER_MODEL,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    club = models.ForeignKey(
 | 
				
			||||||
 | 
					        Club,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    roles = models.ForeignKey(
 | 
				
			||||||
 | 
					        Role,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    date_start = models.DateField(
 | 
				
			||||||
 | 
					        verbose_name=_('membership starts on'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    date_end = models.DateField(
 | 
				
			||||||
 | 
					        verbose_name=_('membership ends on'),
 | 
				
			||||||
 | 
					        null=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    fee = models.PositiveIntegerField(
 | 
				
			||||||
 | 
					        verbose_name=_('fee'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        verbose_name = _('membership')
 | 
				
			||||||
 | 
					        verbose_name_plural = _('memberships')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@receiver(post_save, sender=settings.AUTH_USER_MODEL)
 | 
				
			||||||
 | 
					def save_user_profile(instance, created, **_kwargs):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Hook to save an user profile when an user is updated
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    if created:
 | 
				
			||||||
 | 
					        Profile.objects.create(user=instance)
 | 
				
			||||||
 | 
					    instance.profile.save()
 | 
				
			||||||
							
								
								
									
										0
									
								
								member/tests/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								member/tests/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -1,10 +1,9 @@
 | 
				
			|||||||
from django.contrib import admin
 | 
					from django.contrib import admin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .models import NoteClub, NoteSpec, NoteUser
 | 
					from .models.notes import NoteClub, NoteUser, NoteSpecial, Alias
 | 
				
			||||||
from .models import Alias
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Register your models here.
 | 
					# Register your models here.
 | 
				
			||||||
admin.site.register(NoteClub)
 | 
					admin.site.register(NoteClub)
 | 
				
			||||||
admin.site.register(NoteSpec)
 | 
					 | 
				
			||||||
admin.site.register(NoteUser)
 | 
					admin.site.register(NoteUser)
 | 
				
			||||||
 | 
					admin.site.register(NoteSpecial)
 | 
				
			||||||
admin.site.register(Alias)
 | 
					admin.site.register(Alias)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										91
									
								
								note/locale/fr/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								note/locale/fr/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					# SOME DESCRIPTIVE TITLE.
 | 
				
			||||||
 | 
					# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 | 
				
			||||||
 | 
					# This file is distributed under the same license as the PACKAGE package.
 | 
				
			||||||
 | 
					# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#, fuzzy
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
 | 
					"POT-Creation-Date: 2019-07-16 12:42+0200\n"
 | 
				
			||||||
 | 
					"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
				
			||||||
 | 
					"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
				
			||||||
 | 
					"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
				
			||||||
 | 
					"Language: \n"
 | 
				
			||||||
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
 | 
					"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: apps.py:11
 | 
				
			||||||
 | 
					msgid "note"
 | 
				
			||||||
 | 
					msgstr "note"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:19
 | 
				
			||||||
 | 
					msgid "account balance"
 | 
				
			||||||
 | 
					msgstr "solde du compte"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:20
 | 
				
			||||||
 | 
					msgid "in centimes, money credited for this instance"
 | 
				
			||||||
 | 
					msgstr "en centimes, argent crédité pour cette instance"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:23
 | 
				
			||||||
 | 
					msgid "active"
 | 
				
			||||||
 | 
					msgstr "actif"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:26
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Designates whether this note should be treated as active. Unselect this "
 | 
				
			||||||
 | 
					"instead of deleting notes."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Indique si la note est active. Désactiver cela plutôt que supprimer la note."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:43
 | 
				
			||||||
 | 
					msgid "one's note"
 | 
				
			||||||
 | 
					msgstr "note d'un utilisateur"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:44
 | 
				
			||||||
 | 
					msgid "users note"
 | 
				
			||||||
 | 
					msgstr "notes des utilisateurs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:58
 | 
				
			||||||
 | 
					msgid "club note"
 | 
				
			||||||
 | 
					msgstr "note d'un club"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:59
 | 
				
			||||||
 | 
					msgid "clubs notes"
 | 
				
			||||||
 | 
					msgstr "notes des clubs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:72 models/transactions.py:31 models/transactions.py:60
 | 
				
			||||||
 | 
					msgid "type"
 | 
				
			||||||
 | 
					msgstr "type"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/notes.py:83 models/transactions.py:18
 | 
				
			||||||
 | 
					msgid "name"
 | 
				
			||||||
 | 
					msgstr "nom"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/transactions.py:25 models/transactions.py:47
 | 
				
			||||||
 | 
					#: models/transactions.py:50
 | 
				
			||||||
 | 
					msgid "destination"
 | 
				
			||||||
 | 
					msgstr "destination"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/transactions.py:28 models/transactions.py:57
 | 
				
			||||||
 | 
					msgid "amount"
 | 
				
			||||||
 | 
					msgstr "montant"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/transactions.py:41
 | 
				
			||||||
 | 
					msgid "source"
 | 
				
			||||||
 | 
					msgstr "source"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/transactions.py:54
 | 
				
			||||||
 | 
					msgid "quantity"
 | 
				
			||||||
 | 
					msgstr "quantité"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/transactions.py:64
 | 
				
			||||||
 | 
					msgid "description"
 | 
				
			||||||
 | 
					msgstr "description"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: models/transactions.py:67
 | 
				
			||||||
 | 
					msgid "valid"
 | 
				
			||||||
 | 
					msgstr "valide"
 | 
				
			||||||
@@ -1,8 +1,9 @@
 | 
				
			|||||||
# Generated by Django 2.2.3 on 2019-07-16 07:17
 | 
					# Generated by Django 2.2.3 on 2019-07-16 10:33
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
from django.db import migrations, models
 | 
					from django.db import migrations, models
 | 
				
			||||||
import django.db.models.deletion
 | 
					import django.db.models.deletion
 | 
				
			||||||
 | 
					import django.utils.timezone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Migration(migrations.Migration):
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
@@ -10,54 +11,89 @@ class Migration(migrations.Migration):
 | 
				
			|||||||
    initial = True
 | 
					    initial = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dependencies = [
 | 
					    dependencies = [
 | 
				
			||||||
        ('contenttypes', '0002_remove_content_type_name'),
 | 
					 | 
				
			||||||
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 | 
					        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 | 
				
			||||||
 | 
					        ('member', '0001_initial'),
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    operations = [
 | 
					    operations = [
 | 
				
			||||||
        migrations.CreateModel(
 | 
					        migrations.CreateModel(
 | 
				
			||||||
            name='NoteClub',
 | 
					            name='Note',
 | 
				
			||||||
            fields=[
 | 
					            fields=[
 | 
				
			||||||
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
                ('balance', models.DecimalField(decimal_places=2, default=0, help_text='money credited for this instance', max_digits=8, verbose_name='account balance')),
 | 
					                ('balance', models.IntegerField(help_text='in centimes, money credited for this instance', verbose_name='account balance')),
 | 
				
			||||||
                ('is_active', models.BooleanField(default=True, verbose_name='is active')),
 | 
					                ('is_active', models.BooleanField(default=True, help_text='Designates whether this note should be treated as active. Unselect this instead of deleting notes.', verbose_name='active')),
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            options={
 | 
					 | 
				
			||||||
                'abstract': False,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        migrations.CreateModel(
 | 
					        migrations.CreateModel(
 | 
				
			||||||
            name='NoteSpec',
 | 
					            name='Transaction',
 | 
				
			||||||
            fields=[
 | 
					            fields=[
 | 
				
			||||||
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
                ('balance', models.DecimalField(decimal_places=2, default=0, help_text='money credited for this instance', max_digits=8, verbose_name='account balance')),
 | 
					                ('datetime', models.DateTimeField(default=django.utils.timezone.now, verbose_name='destination')),
 | 
				
			||||||
                ('is_active', models.BooleanField(default=True, verbose_name='is active')),
 | 
					                ('quantity', models.PositiveSmallIntegerField(verbose_name='quantity')),
 | 
				
			||||||
                ('account_type', models.CharField(choices=[('CH', 'bank check'), ('CB', 'credit card'), ('VB', 'bank transfer'), ('CA', 'cash'), ('RB', 'refund')], max_length=2, unique=True)),
 | 
					                ('amount', models.PositiveIntegerField(verbose_name='amount')),
 | 
				
			||||||
 | 
					                ('transaction_type', models.CharField(max_length=31, verbose_name='type')),
 | 
				
			||||||
 | 
					                ('description', models.TextField(verbose_name='description')),
 | 
				
			||||||
 | 
					                ('valid', models.NullBooleanField(verbose_name='valid')),
 | 
				
			||||||
 | 
					                ('destination', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='note.Note', verbose_name='destination')),
 | 
				
			||||||
 | 
					                ('source', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='note.Note', verbose_name='source')),
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            options={
 | 
					 | 
				
			||||||
                'abstract': False,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        migrations.CreateModel(
 | 
					        migrations.CreateModel(
 | 
				
			||||||
            name='NoteUser',
 | 
					            name='NoteSpecial',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('note_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='note.Note')),
 | 
				
			||||||
 | 
					                ('special_type', models.CharField(max_length=255, unique=True, verbose_name='type')),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            bases=('note.note',),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='TransactionTemplate',
 | 
				
			||||||
            fields=[
 | 
					            fields=[
 | 
				
			||||||
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
                ('balance', models.DecimalField(decimal_places=2, default=0, help_text='money credited for this instance', max_digits=8, verbose_name='account balance')),
 | 
					                ('name', models.CharField(max_length=255, verbose_name='name')),
 | 
				
			||||||
                ('is_active', models.BooleanField(default=True, verbose_name='is active')),
 | 
					                ('amount', models.PositiveIntegerField(verbose_name='amount')),
 | 
				
			||||||
                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
 | 
					                ('template_type', models.CharField(max_length=31, verbose_name='type')),
 | 
				
			||||||
 | 
					                ('destination', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='note.Note', verbose_name='destination')),
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            options={
 | 
					 | 
				
			||||||
                'verbose_name': "one's note",
 | 
					 | 
				
			||||||
                'verbose_name_plural': 'users note',
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        migrations.CreateModel(
 | 
					        migrations.CreateModel(
 | 
				
			||||||
            name='Alias',
 | 
					            name='Alias',
 | 
				
			||||||
            fields=[
 | 
					            fields=[
 | 
				
			||||||
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
					                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 | 
				
			||||||
                ('alias', models.TextField(unique=True, verbose_name='alias')),
 | 
					                ('name', models.CharField(max_length=255, unique=True, verbose_name='name')),
 | 
				
			||||||
                ('owner_id', models.PositiveIntegerField()),
 | 
					                ('note', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='note.Note')),
 | 
				
			||||||
                ('owner_type', models.ForeignKey(limit_choices_to=models.Q(models.Q(('app_label', 'note'), ('model', 'NoteUser')), models.Q(('app_label', 'note'), ('model', 'NoteClub')), _connector='OR'), on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
 | 
					 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='NoteUser',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('note_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='note.Note')),
 | 
				
			||||||
 | 
					                ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='note', to=settings.AUTH_USER_MODEL)),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            options={
 | 
				
			||||||
 | 
					                'verbose_name': "one's note",
 | 
				
			||||||
 | 
					                'verbose_name_plural': 'users note',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            bases=('note.note',),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='NoteClub',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('note_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='note.Note')),
 | 
				
			||||||
 | 
					                ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='note', to='member.Club')),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            options={
 | 
				
			||||||
 | 
					                'verbose_name': 'club note',
 | 
				
			||||||
 | 
					                'verbose_name_plural': 'clubs notes',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            bases=('note.note',),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='MembershipTransaction',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('transaction_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='note.Transaction')),
 | 
				
			||||||
 | 
					                ('membership', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='transaction', to='member.Membership')),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            bases=('note.transaction',),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,89 +0,0 @@
 | 
				
			|||||||
# -*- mode: python; coding: utf-8 -*-
 | 
					 | 
				
			||||||
# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
					 | 
				
			||||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from django.conf import settings
 | 
					 | 
				
			||||||
from django.contrib.auth.models import User
 | 
					 | 
				
			||||||
from django.db import models
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from django.utils.translation import gettext_lazy as _
 | 
					 | 
				
			||||||
from django.contrib.contenttypes.models import ContentType
 | 
					 | 
				
			||||||
from django.contrib.contenttypes.fields import GenericForeignKey
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Alias(models.Model):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    A alias labels a Note instance, only for user and clubs
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    alias = models.TextField(
 | 
					 | 
				
			||||||
        "alias",
 | 
					 | 
				
			||||||
        unique=True,
 | 
					 | 
				
			||||||
        blank=False,
 | 
					 | 
				
			||||||
        null=False,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Owner can be linked to an user note or a club note
 | 
					 | 
				
			||||||
    limit = models.Q(app_label="note", model="NoteUser") | models.Q(app_label="note", model="NoteClub")
 | 
					 | 
				
			||||||
    owner_id = models.PositiveIntegerField()
 | 
					 | 
				
			||||||
    owner_type = models.ForeignKey(
 | 
					 | 
				
			||||||
        ContentType,
 | 
					 | 
				
			||||||
        on_delete=models.CASCADE,
 | 
					 | 
				
			||||||
        limit_choices_to=limit
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    owner = GenericForeignKey('owner_type', 'owner_id')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Note(models.Model):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    An abstract model, use to add transactions capabilities to a user
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    balance = models.DecimalField(
 | 
					 | 
				
			||||||
        verbose_name=_('account balance'),
 | 
					 | 
				
			||||||
        help_text=_("money credited for this instance"),
 | 
					 | 
				
			||||||
        decimal_places=2,  # Limit to centimes
 | 
					 | 
				
			||||||
        max_digits=8,  # Limit to 999999,99€
 | 
					 | 
				
			||||||
        default=0,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    is_active = models.BooleanField(
 | 
					 | 
				
			||||||
        default=True,
 | 
					 | 
				
			||||||
        verbose_name=_('is active')
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    class Meta:
 | 
					 | 
				
			||||||
        abstract = True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class NoteUser(Note):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    A Note associated to an User
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    user = models.OneToOneField(
 | 
					 | 
				
			||||||
        settings.AUTH_USER_MODEL,
 | 
					 | 
				
			||||||
        on_delete=models.CASCADE,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    class Meta:
 | 
					 | 
				
			||||||
        verbose_name = _("one's note")
 | 
					 | 
				
			||||||
        verbose_name_plural = _("users note")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class NoteSpec(Note):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    A Note for special account, where real money enter or leave the system
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    account_type = models.CharField(
 | 
					 | 
				
			||||||
        max_length=2,
 | 
					 | 
				
			||||||
        choices=(
 | 
					 | 
				
			||||||
            ("CH", _("bank check")),
 | 
					 | 
				
			||||||
            ("CB", _("credit card")),
 | 
					 | 
				
			||||||
            ("VB", _("bank transfer")),
 | 
					 | 
				
			||||||
            ("CA", _("cash")),
 | 
					 | 
				
			||||||
            ("RB", _("refund")),
 | 
					 | 
				
			||||||
        ),
 | 
					 | 
				
			||||||
        unique=True,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class NoteClub(Note):
 | 
					 | 
				
			||||||
    # to be added
 | 
					 | 
				
			||||||
    pass
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								note/models/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								note/models/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .notes import *
 | 
				
			||||||
 | 
					from .transactions import *
 | 
				
			||||||
							
								
								
									
										90
									
								
								note/models/notes.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								note/models/notes.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.db import models
 | 
				
			||||||
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Defines each note types
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Note(models.Model):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    An abstract model, use to add transactions capabilities to a user
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    balance = models.IntegerField(
 | 
				
			||||||
 | 
					        verbose_name=_('account balance'),
 | 
				
			||||||
 | 
					        help_text=_('in centimes, money credited for this instance'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    is_active = models.BooleanField(
 | 
				
			||||||
 | 
					        _('active'),
 | 
				
			||||||
 | 
					        default=True,
 | 
				
			||||||
 | 
					        help_text=_(
 | 
				
			||||||
 | 
					            'Designates whether this note should be treated as active. '
 | 
				
			||||||
 | 
					            'Unselect this instead of deleting notes.'
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NoteUser(Note):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    A Note associated to an User
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    user = models.OneToOneField(
 | 
				
			||||||
 | 
					        settings.AUTH_USER_MODEL,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='note',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        verbose_name = _("one's note")
 | 
				
			||||||
 | 
					        verbose_name_plural = _("users note")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NoteClub(Note):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    A Note associated to a Club
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    user = models.OneToOneField(
 | 
				
			||||||
 | 
					        'member.Club',
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='note',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        verbose_name = _("club note")
 | 
				
			||||||
 | 
					        verbose_name_plural = _("clubs notes")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NoteSpecial(Note):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    A Note for special account, where real money enter or leave the system
 | 
				
			||||||
 | 
					    - bank check
 | 
				
			||||||
 | 
					    - credit card
 | 
				
			||||||
 | 
					    - bank transfer
 | 
				
			||||||
 | 
					    - cash
 | 
				
			||||||
 | 
					    - refund
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    special_type = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('type'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					        unique=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Alias(models.Model):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    An alias labels a Note instance, only for user and clubs
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    name = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('name'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					        unique=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    note = models.ForeignKey(
 | 
				
			||||||
 | 
					        Note,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
							
								
								
									
										76
									
								
								note/models/transactions.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								note/models/transactions.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					# -*- mode: python; coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.db import models
 | 
				
			||||||
 | 
					from django.utils import timezone
 | 
				
			||||||
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .notes import Note
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Defines transactions
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TransactionTemplate(models.Model):
 | 
				
			||||||
 | 
					    name = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('name'),
 | 
				
			||||||
 | 
					        max_length=255,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    destination = models.ForeignKey(
 | 
				
			||||||
 | 
					        Note,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',  # no reverse
 | 
				
			||||||
 | 
					        verbose_name=_('destination'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    amount = models.PositiveIntegerField(
 | 
				
			||||||
 | 
					        verbose_name=_('amount'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    template_type = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('type'),
 | 
				
			||||||
 | 
					        max_length=31
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Transaction(models.Model):
 | 
				
			||||||
 | 
					    source = models.ForeignKey(
 | 
				
			||||||
 | 
					        Note,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					        verbose_name=_('source'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    destination = models.ForeignKey(
 | 
				
			||||||
 | 
					        Note,
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					        verbose_name=_('destination'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    datetime = models.DateTimeField(
 | 
				
			||||||
 | 
					        verbose_name=_('destination'),
 | 
				
			||||||
 | 
					        default=timezone.now,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    quantity = models.PositiveSmallIntegerField(
 | 
				
			||||||
 | 
					        verbose_name=_('quantity'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    amount = models.PositiveIntegerField(
 | 
				
			||||||
 | 
					        verbose_name=_('amount'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    transaction_type = models.CharField(
 | 
				
			||||||
 | 
					        verbose_name=_('type'),
 | 
				
			||||||
 | 
					        max_length=31,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    description = models.TextField(
 | 
				
			||||||
 | 
					        verbose_name=_('description'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    valid = models.NullBooleanField(
 | 
				
			||||||
 | 
					        verbose_name=_('valid'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MembershipTransaction(Transaction):
 | 
				
			||||||
 | 
					    membership = models.OneToOneField(
 | 
				
			||||||
 | 
					        'member.Membership',
 | 
				
			||||||
 | 
					        on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					        related_name='transaction',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
@@ -46,7 +46,8 @@ INSTALLED_APPS = [
 | 
				
			|||||||
    'guardian',
 | 
					    'guardian',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Note apps
 | 
					    # Note apps
 | 
				
			||||||
    'adherents',
 | 
					    'activity',
 | 
				
			||||||
 | 
					    'member',
 | 
				
			||||||
    'note',
 | 
					    'note',
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2019-07-08 13:45+0200\n"
 | 
					"POT-Creation-Date: 2019-07-16 12:36+0200\n"
 | 
				
			||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
					"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
				
			||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
					"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
				
			||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
					"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user