Merge branch 'michele.orru/gestioCOF-supportBDS' into supportBDS
This commit is contained in:
commit
d46ab87e9b
6 changed files with 124 additions and 13 deletions
|
@ -2,6 +2,7 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
import bds.models
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
@ -14,8 +15,15 @@ class Migration(migrations.Migration):
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='BdsProfile',
|
name='BdsProfile',
|
||||||
fields=[
|
fields=[
|
||||||
('profile', models.OneToOneField(serialize=False, to='gestion.Profile', primary_key=True)),
|
('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
|
||||||
|
('ASPSL_number', models.CharField(null=True, blank=True, verbose_name='Numéro AS PSL', max_length=50)),
|
||||||
|
('FFSU_number', models.CharField(null=True, blank=True, verbose_name='Numéro FFSU', max_length=50)),
|
||||||
|
('have_certificate', models.BooleanField(verbose_name='Certificat médical', default=False)),
|
||||||
|
('certificate_file', models.FileField(blank=True, upload_to=bds.models.BdsProfile.issue_file_name, verbose_name='Fichier de certificat médical')),
|
||||||
|
('cotisation_period', models.CharField(choices=[('ANN', 'Année'), ('SE1', 'Premier semestre'), ('SE2', 'Deuxième semestre')], verbose_name='Inscription', max_length=3, default='ANN')),
|
||||||
|
('registration_date', models.DateField(verbose_name="Date d'inscription", auto_now_add=True)),
|
||||||
|
('payment_method', models.CharField(choices=[('CASH', 'Liquide'), ('BANK', 'Transfer bancaire'), ('CHEQUE', 'Cheque'), ('OTHER', 'Autre')], verbose_name='Methode de paiement', max_length=6, default='CASH')),
|
||||||
|
('profile', models.OneToOneField(related_name='bds', to='gestion.Profile')),
|
||||||
],
|
],
|
||||||
bases=('gestion.profile',),
|
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,9 +1,56 @@
|
||||||
from django.db import models
|
import os.path
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
from gestion.models import Profile
|
from gestion.models import Profile
|
||||||
|
|
||||||
class BdsProfile(Profile):
|
class BdsProfile(models.Model):
|
||||||
profile = models.OneToOneField(Profile, on_delete=models.CASCADE)
|
profile = models.OneToOneField(Profile,
|
||||||
|
related_name='bds',
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
# mailing = models.BooleanField("Recevoir les mails BDS", default=False)
|
def issue_file_name(sportif, filename):
|
||||||
|
fn, extension = os.path.splitext(filename)
|
||||||
|
year = str(datetime.now().year)
|
||||||
|
return "certifs/" + sportif.__str__() + '-' + year + extension
|
||||||
|
|
||||||
|
COTIZ_DURATION_CHOICES = (
|
||||||
|
('ANN', 'Année'),
|
||||||
|
('SE1', 'Premier semestre'),
|
||||||
|
('SE2', 'Deuxième semestre'),
|
||||||
|
)
|
||||||
|
|
||||||
|
PAYMENT_METHOD_CHOICES = (
|
||||||
|
('CASH', 'Liquide'),
|
||||||
|
('BANK', 'Transfer bancaire'),
|
||||||
|
('CHEQUE', 'Cheque'),
|
||||||
|
('OTHER', 'Autre'),
|
||||||
|
)
|
||||||
|
|
||||||
|
ASPSL_number = models.CharField("Numéro AS PSL",
|
||||||
|
max_length=50,
|
||||||
|
blank=True,
|
||||||
|
null=True)
|
||||||
|
FFSU_number = models.CharField("Numéro FFSU",
|
||||||
|
max_length=50,
|
||||||
|
blank=True,
|
||||||
|
null=True)
|
||||||
|
|
||||||
|
have_certificate = models.BooleanField("Certificat médical",
|
||||||
|
default=False)
|
||||||
|
certificate_file = models.FileField("Fichier de certificat médical",
|
||||||
|
upload_to=issue_file_name,
|
||||||
|
blank=True)
|
||||||
|
|
||||||
|
cotisation_period = models.CharField("Inscription",
|
||||||
|
default="ANN",
|
||||||
|
choices=COTIZ_DURATION_CHOICES,
|
||||||
|
max_length=3)
|
||||||
|
registration_date = models.DateField(auto_now_add=True,
|
||||||
|
verbose_name="Date d'inscription")
|
||||||
|
|
||||||
|
payment_method = models.CharField('Methode de paiement',
|
||||||
|
default='CASH',
|
||||||
|
choices=PAYMENT_METHOD_CHOICES,
|
||||||
|
max_length=6)
|
||||||
|
|
11
bds/tests.py
11
bds/tests.py
|
@ -1,3 +1,12 @@
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
# Create your tests here.
|
from gestion.tests import create_profile
|
||||||
|
|
||||||
|
from .models import BdsProfile
|
||||||
|
|
||||||
|
class TestBdsProfile(TestCase):
|
||||||
|
def test_profile(self):
|
||||||
|
# each bdspofile should have an associated profile
|
||||||
|
p = create_profile('foo')
|
||||||
|
bdsp = BdsProfile.objects.create(profile=p)
|
||||||
|
self.assertEqual(p.bds, bdsp)
|
||||||
|
|
|
@ -170,10 +170,11 @@ class UserProfileAdmin(UserAdmin):
|
||||||
list_display = ('profile_num',) + UserAdmin.list_display \
|
list_display = ('profile_num',) + UserAdmin.list_display \
|
||||||
+ ('profile_login_clipper', 'profile_phone', 'profile_occupation',
|
+ ('profile_login_clipper', 'profile_phone', 'profile_occupation',
|
||||||
'profile_mailing_cof', 'profile_mailing_bda',
|
'profile_mailing_cof', 'profile_mailing_bda',
|
||||||
'profile_mailing_bda_revente', 'is_cof', 'is_buro', )
|
'profile_mailing_bda_revente', 'is_buro', )
|
||||||
list_display_links = ('username', 'email', 'first_name', 'last_name')
|
list_display_links = ('username', 'email', 'first_name', 'last_name')
|
||||||
list_filter = UserAdmin.list_filter \
|
list_filter = UserAdmin.list_filter \
|
||||||
+ ('profile__cof__is_cof',
|
+ (
|
||||||
|
# 'profile__cof__is_cof',
|
||||||
'profile__cof__is_buro',
|
'profile__cof__is_buro',
|
||||||
'profile__cof__mailing',
|
'profile__cof__mailing',
|
||||||
'profile__cof__mailing_bda')
|
'profile__cof__mailing_bda')
|
||||||
|
|
|
@ -6,7 +6,7 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import Group, Permission, User
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils.encoding import python_2_unicode_compatible
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
import django.utils.six as six
|
import django.utils.six as six
|
||||||
|
@ -43,7 +43,6 @@ class CofProfile(models.Model):
|
||||||
mailing = models.BooleanField("Recevoir les mails COF", default=False)
|
mailing = models.BooleanField("Recevoir les mails COF", default=False)
|
||||||
# XXX. remove the following and use django auth.
|
# XXX. remove the following and use django auth.
|
||||||
is_buro = models.BooleanField("Membre du Burô", default=False)
|
is_buro = models.BooleanField("Membre du Burô", default=False)
|
||||||
is_cof = models.BooleanField("Membre du COF", default=False)
|
|
||||||
# XXX. remove the following and put in a BDA profile
|
# XXX. remove the following and put in a BDA profile
|
||||||
mailing_bda = models.BooleanField("Recevoir les mails BdA", default=False)
|
mailing_bda = models.BooleanField("Recevoir les mails BdA", default=False)
|
||||||
mailing_bda_revente = models.BooleanField(
|
mailing_bda_revente = models.BooleanField(
|
||||||
|
@ -55,12 +54,25 @@ class CofProfile(models.Model):
|
||||||
_("Remarques et précisions pour les petits cours"),
|
_("Remarques et précisions pour les petits cours"),
|
||||||
blank=True, default="")
|
blank=True, default="")
|
||||||
|
|
||||||
|
|
||||||
|
# is_cof = models.BooleanField("Membre du COF", default=False)
|
||||||
|
@property
|
||||||
|
def is_cof(self):
|
||||||
|
return self.profile.user.has_perm('cof.member')
|
||||||
|
|
||||||
|
@is_cof.setter
|
||||||
|
def is_cof(self, really):
|
||||||
|
if really:
|
||||||
|
g = Group.objects.get(name='cof_members')
|
||||||
|
self.groups.add(g)
|
||||||
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Profil COF"
|
verbose_name = "Profil COF"
|
||||||
verbose_name_plural = "Profils COF"
|
verbose_name_plural = "Profils COF"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.user.username
|
return self.profile.user.username
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
|
|
36
cof/tests.py
36
cof/tests.py
|
@ -1,3 +1,37 @@
|
||||||
|
from django.contrib.auth.models import Group, Permission, User
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
# Create your tests here.
|
from cof.models import CofProfile
|
||||||
|
|
||||||
|
from gestion.tests import create_profile
|
||||||
|
|
||||||
|
def create_cofprofile(username):
|
||||||
|
p = create_profile(username)
|
||||||
|
return CofProfile.objects.create(profile=p)
|
||||||
|
|
||||||
|
class TestCofProfile(TestCase):
|
||||||
|
def test_str(self):
|
||||||
|
# creates a group of cof members
|
||||||
|
group = Group.objects.create(name='cof_members')
|
||||||
|
|
||||||
|
# create a specific permission for all COF members.
|
||||||
|
ct = ContentType.objects.get(app_label='cof', model='CofProfile')
|
||||||
|
perm = Permission.objects.create(name='Cof Member',
|
||||||
|
codename='member',
|
||||||
|
content_type=ct)
|
||||||
|
|
||||||
|
# bind the two mutherfucker.
|
||||||
|
group.permissions = [perm]
|
||||||
|
|
||||||
|
# now test it for real
|
||||||
|
cofp = create_cofprofile('foo')
|
||||||
|
# XXX. should by default new CofProfiles be COF members?
|
||||||
|
self.assertFalse(cofp.profile.user.has_perm('cof.member'))
|
||||||
|
# adding/removing a user from the group should impact the
|
||||||
|
# permission
|
||||||
|
cofp.profile.user.groups.add(group)
|
||||||
|
cofp.save()
|
||||||
|
|
||||||
|
cofp = CofProfile.objects.first()
|
||||||
|
self.assertTrue(cofp.profile.user.has_perm('cof.member'))
|
||||||
|
|
Loading…
Reference in a new issue