diff --git a/club/migrations/0003_auto_20160902_2042.py b/club/migrations/0003_auto_20160902_2042.py
new file mode 100644
index 00000000..f0d7e014
--- /dev/null
+++ b/club/migrations/0003_auto_20160902_2042.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('club', '0002_auto_20160824_2152'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='membership',
+ name='start_date',
+ field=models.DateField(verbose_name='start date'),
+ ),
+ ]
diff --git a/club/models.py b/club/models.py
index 44aeb373..19b2caa1 100644
--- a/club/models.py
+++ b/club/models.py
@@ -5,6 +5,7 @@ from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError
from django.db import IntegrityError, transaction
from django.core.urlresolvers import reverse
+from django.utils import timezone
from core.models import User, MetaGroup, Group, SithFile
from subscription.models import Subscriber
@@ -103,9 +104,7 @@ class Club(models.Model):
"""
Method to see if that object can be super edited by the given user
"""
- if user.is_in_group(settings.SITH_MAIN_BOARD_GROUP):
- return True
- return False
+ return user.is_in_group(settings.SITH_MAIN_BOARD_GROUP)
def can_be_edited_by(self, user):
"""
@@ -144,7 +143,7 @@ class Membership(models.Model):
"""
user = models.ForeignKey(User, verbose_name=_('user'), related_name="membership", null=False, blank=False)
club = models.ForeignKey(Club, verbose_name=_('club'), related_name="members", null=False, blank=False)
- start_date = models.DateField(_('start date'), auto_now=True)
+ start_date = models.DateField(_('start date'))
end_date = models.DateField(_('end date'), null=True, blank=True)
role = models.IntegerField(_('role'), choices=sorted(settings.SITH_CLUB_ROLES.items()),
default=sorted(settings.SITH_CLUB_ROLES.items())[0][0])
@@ -157,11 +156,31 @@ class Membership(models.Model):
if Membership.objects.filter(user=self.user).filter(club=self.club).filter(end_date=None).exists():
raise ValidationError(_('User is already member of that club'))
+ def save(self, *args, **kwargs):
+ if not self.id:
+ self.start_date = timezone.now()
+ return super(Membership, self).save(*args, **kwargs)
+
def __str__(self):
return self.club.name+' - '+self.user.username+' - '+str(settings.SITH_CLUB_ROLES[self.role])+str(
" - "+str(_('past member')) if self.end_date is not None else ""
)
+ def is_owned_by(self, user):
+ """
+ Method to see if that object can be super edited by the given user
+ """
+ return user.is_in_group(settings.SITH_MAIN_BOARD_GROUP)
+
+ def can_be_edited_by(self, user):
+ """
+ Method to see if that object can be edited by the given user
+ """
+ if user.membership:
+ ms = user.membership.filter(club=self.club, end_date=None).first()
+ return (ms and ms.role >= self.role) or user.is_in_group(settings.SITH_MAIN_BOARD_GROUP)
+ return user.is_in_group(settings.SITH_MAIN_BOARD_GROUP)
+
def get_absolute_url(self):
return reverse('club:club_members', kwargs={'club_id': self.club.id})
diff --git a/club/templates/club/club_base.jinja b/club/templates/club/club_base.jinja
index 240fffe6..16ea246a 100644
--- a/club/templates/club/club_base.jinja
+++ b/club/templates/club/club_base.jinja
@@ -18,6 +18,14 @@
>{% trans %}Members{% endtrans %}
{% endif %}
+ {% if can_view(club, user) %}
+ {% trans %}Old members{% endtrans %}
+ {% endif %}
+
{% if can_view(club, user) %}
{% trans %}User{% endtrans %}
{% trans %}Role{% endtrans %} |
{% trans %}Description{% endtrans %} |
+ {% trans %}Since{% endtrans %} |
{% for m in club.members.filter(end_date=None).order_by('-role').all() %}
@@ -15,6 +16,10 @@
{{ user_profile_link(m.user) }} |
{{ settings.SITH_CLUB_ROLES[m.role] }} |
{{ m.description }} |
+ {{ m.start_date }} |
+ {% if m.can_be_edited_by(user) %}
+ {% trans %}Mark as old{% endtrans %} |
+ {% endif %}
{% endfor %}
diff --git a/club/templates/club/club_old_members.jinja b/club/templates/club/club_old_members.jinja
new file mode 100644
index 00000000..4c99697b
--- /dev/null
+++ b/club/templates/club/club_old_members.jinja
@@ -0,0 +1,29 @@
+{% extends "club/club_base.jinja" %}
+{% from 'core/macros.jinja' import user_profile_link %}
+
+{% block club %}
+ {% trans %}Club old members{% endtrans %}
+
+
+ {% trans %}User{% endtrans %} |
+ {% trans %}Role{% endtrans %} |
+ {% trans %}Description{% endtrans %} |
+ {% trans %}From{% endtrans %} |
+ {% trans %}To{% endtrans %} |
+
+
+ {% for m in club.members.exclude(end_date=None).order_by('-role', '-end_date').all() %}
+
+ {{ user_profile_link(m.user) }} |
+ {{ settings.SITH_CLUB_ROLES[m.role] }} |
+ {{ m.description }} |
+ {{ m.start_date }} |
+ {{ m.end_date }} |
+
+ {% endfor %}
+
+
+{% endblock %}
+
+
+
diff --git a/club/urls.py b/club/urls.py
index 497c0818..50625ebf 100644
--- a/club/urls.py
+++ b/club/urls.py
@@ -8,7 +8,9 @@ urlpatterns = [
url(r'^(?P[0-9]+)/$', ClubView.as_view(), name='club_view'),
url(r'^(?P[0-9]+)/edit$', ClubEditView.as_view(), name='club_edit'),
url(r'^(?P[0-9]+)/members$', ClubMembersView.as_view(), name='club_members'),
+ url(r'^(?P[0-9]+)/elderlies$', ClubOldMembersView.as_view(), name='club_old_members'),
url(r'^(?P[0-9]+)/prop$', ClubEditPropView.as_view(), name='club_prop'),
url(r'^(?P[0-9]+)/tools$', ClubToolsView.as_view(), name='tools'),
+ url(r'^membership/(?P[0-9]+)/set_old$', MembershipSetOldView.as_view(), name='membership_set_old'),
]
diff --git a/club/views.py b/club/views.py
index 5798158c..82bffb56 100644
--- a/club/views.py
+++ b/club/views.py
@@ -4,7 +4,9 @@ from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, CreateView
from django.forms import CheckboxSelectMultiple
from django.core.exceptions import ValidationError
-
+from django.http import HttpResponseRedirect
+from django.core.urlresolvers import reverse
+from django.utils import timezone
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin
from club.models import Club, Membership
@@ -102,6 +104,19 @@ class ClubMembersView(CanViewMixin, UpdateView):
kwargs['tab'] = "members"
return kwargs
+class ClubOldMembersView(CanViewMixin, DetailView):
+ """
+ Old members of a club
+ """
+ model = Club
+ pk_url_kwarg = "club_id"
+ template_name = 'club/club_old_members.jinja'
+
+ def get_context_data(self, **kwargs):
+ kwargs = super(ClubOldMembersView, self).get_context_data(**kwargs)
+ kwargs['tab'] = "elderlies"
+ return kwargs
+
class ClubEditView(CanEditMixin, UpdateView):
"""
Edit a Club's main informations (for the club's members)
@@ -139,3 +154,20 @@ class ClubCreateView(CanEditPropMixin, CreateView):
fields = ['name', 'unix_name', 'parent']
template_name = 'club/club_edit_prop.jinja'
+class MembershipSetOldView(CanEditMixin, DetailView):
+ """
+ Set a membership as beeing old
+ """
+ model = Membership
+ pk_url_kwarg = "membership_id"
+
+ def get(self, request, *args, **kwargs):
+ self.object = self.get_object()
+ self.object.end_date = timezone.now()
+ self.object.save()
+ return HttpResponseRedirect(reverse('club:club_members', args=self.args, kwargs={'club_id': self.object.club.id}))
+
+ def post(self, request, *args, **kwargs):
+ self.object = self.get_object()
+ return HttpResponseRedirect(reverse('club:club_members', args=self.args, kwargs={'club_id': self.object.club.id}))
+
diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo
index 763b35c3..a89e6afe 100644
Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index a1ccacf9..9ac10d91 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-09-02 19:31+0200\n"
+"POT-Creation-Date: 2016-09-02 21:18+0200\n"
"PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia \n"
"Language-Team: AE info \n"
@@ -17,7 +17,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: accounting/models.py:36 accounting/models.py:55 accounting/models.py:82
-#: accounting/models.py:132 club/models.py:18 counter/models.py:52
+#: accounting/models.py:132 club/models.py:19 counter/models.py:52
#: counter/models.py:77 counter/models.py:111 launderette/models.py:15
#: launderette/models.py:60 launderette/models.py:85
msgid "name"
@@ -63,7 +63,7 @@ msgstr "IBAN"
msgid "account number"
msgstr "numero de compte"
-#: accounting/models.py:58 accounting/models.py:83 club/models.py:146
+#: accounting/models.py:58 accounting/models.py:83 club/models.py:145
#: counter/models.py:86 counter/models.py:112
msgid "club"
msgstr "club"
@@ -85,12 +85,12 @@ msgstr "Compte club"
msgid "%(club_account)s on %(bank_account)s"
msgstr "%(club_account)s sur %(bank_account)s"
-#: accounting/models.py:130 club/models.py:147 counter/models.py:282
+#: accounting/models.py:130 club/models.py:146 counter/models.py:282
#: launderette/models.py:122
msgid "start date"
msgstr "date de début"
-#: accounting/models.py:131 club/models.py:148 counter/models.py:283
+#: accounting/models.py:131 club/models.py:147 counter/models.py:283
msgid "end date"
msgstr "date de fin"
@@ -163,6 +163,7 @@ msgid "target type"
msgstr "type de cible"
#: accounting/models.py:190 club/templates/club/club_members.jinja:8
+#: club/templates/club/club_old_members.jinja:8
#: launderette/templates/launderette/launderette_admin.jinja:44
msgid "User"
msgstr "Utilisateur"
@@ -324,7 +325,7 @@ msgstr "Nouveau compte club"
#: accounting/templates/accounting/bank_account_list.jinja:21
#: accounting/templates/accounting/club_account_details.jinja:53
#: accounting/templates/accounting/journal_details.jinja:66
-#: club/templates/club/club_base.jinja:34 core/templates/core/file.jinja:38
+#: club/templates/club/club_base.jinja:42 core/templates/core/file.jinja:38
#: core/templates/core/page.jinja:31 core/templates/core/user_base.jinja:33
#: core/templates/core/user_tools.jinja:33
#: counter/templates/counter/counter_list.jinja:20
@@ -507,11 +508,11 @@ msgstr "Types simplifiés"
msgid "New simplified type"
msgstr "Nouveau type simplifié"
-#: club/models.py:20
+#: club/models.py:21
msgid "unix name"
msgstr "nom unix"
-#: club/models.py:24
+#: club/models.py:25
msgid ""
"Enter a valid unix name. This value may contain only letters, numbers ./-/_ "
"characters."
@@ -519,50 +520,50 @@ msgstr ""
"Entrez un nom UNIX valide. Cette valeur peut contenir uniquement des "
"lettres, des nombres, et les caractères ./-/_"
-#: club/models.py:29
+#: club/models.py:30
msgid "A club with that unix name already exists."
msgstr "Un club avec ce nom UNIX existe déjà."
-#: club/models.py:32 core/models.py:168
+#: club/models.py:33 core/models.py:168
msgid "address"
msgstr "Adresse"
-#: club/models.py:38 core/models.py:117
+#: club/models.py:39 core/models.py:117
msgid "home"
msgstr "home"
-#: club/models.py:46
+#: club/models.py:47
msgid "You can not make loops in clubs"
msgstr "Vous ne pouvez pas faire de boucles dans les clubs"
-#: club/models.py:60
+#: club/models.py:61
msgid "A club with that unix_name already exists"
msgstr "Un club avec ce nom UNIX existe déjà."
-#: club/models.py:145 counter/models.py:280 counter/models.py:294
+#: club/models.py:144 counter/models.py:280 counter/models.py:294
#: eboutic/models.py:14 eboutic/models.py:47 launderette/models.py:89
#: launderette/models.py:126
msgid "user"
msgstr "nom d'utilisateur"
-#: club/models.py:149 core/models.py:135
+#: club/models.py:148 core/models.py:135
msgid "role"
msgstr "rôle"
-#: club/models.py:151 core/models.py:32 counter/models.py:53
+#: club/models.py:150 core/models.py:32 counter/models.py:53
#: counter/models.py:78
msgid "description"
msgstr "description"
-#: club/models.py:156
+#: club/models.py:155
msgid "User must be subscriber to take part to a club"
msgstr "L'utilisateur doit être cotisant pour faire partie d'un club"
-#: club/models.py:158
+#: club/models.py:157
msgid "User is already member of that club"
msgstr "L'utilisateur est déjà membre de ce club"
-#: club/models.py:162
+#: club/models.py:166
msgid "past member"
msgstr "Anciens membres"
@@ -570,12 +571,16 @@ msgstr "Anciens membres"
msgid "Members"
msgstr "Membres"
-#: club/templates/club/club_base.jinja:26 core/templates/core/base.jinja:25
+#: club/templates/club/club_base.jinja:26
+msgid "Old members"
+msgstr "Anciens membres"
+
+#: club/templates/club/club_base.jinja:34 core/templates/core/base.jinja:25
#: core/templates/core/user_base.jinja:19
msgid "Tools"
msgstr "Outils"
-#: club/templates/club/club_base.jinja:42
+#: club/templates/club/club_base.jinja:50
#: counter/templates/counter/counter_list.jinja:23
msgid "Props"
msgstr "Propriétés"
@@ -606,18 +611,41 @@ msgid "Club members"
msgstr "Membres du club"
#: club/templates/club/club_members.jinja:9
+#: club/templates/club/club_old_members.jinja:9
msgid "Role"
msgstr "Rôle"
#: club/templates/club/club_members.jinja:10
+#: club/templates/club/club_old_members.jinja:10
msgid "Description"
msgstr "Description"
-#: club/templates/club/club_members.jinja:25
+#: club/templates/club/club_members.jinja:11
+#: launderette/templates/launderette/launderette_admin.jinja:45
+msgid "Since"
+msgstr "Depuis"
+
+#: club/templates/club/club_members.jinja:21
+msgid "Mark as old"
+msgstr "Marquer comme ancien"
+
+#: club/templates/club/club_members.jinja:30
#: core/templates/core/file_detail.jinja:19 launderette/views.py:146
msgid "Add"
msgstr "Ajouter"
+#: club/templates/club/club_old_members.jinja:5
+msgid "Club old members"
+msgstr "Anciens membres du club"
+
+#: club/templates/club/club_old_members.jinja:11
+msgid "From"
+msgstr "Du"
+
+#: club/templates/club/club_old_members.jinja:12
+msgid "To"
+msgstr "Au"
+
#: club/templates/club/club_tools.jinja:4
#: core/templates/core/user_tools.jinja:58
msgid "Club tools"
@@ -2218,10 +2246,6 @@ msgstr "Jetons"
msgid "Type"
msgstr "Type"
-#: launderette/templates/launderette/launderette_admin.jinja:45
-msgid "Since"
-msgstr "Depuis"
-
#: launderette/templates/launderette/launderette_book.jinja:11
msgid "Choose"
msgstr "Choisir"
@@ -2448,6 +2472,3 @@ msgstr "Un utilisateur avec cette adresse email existe déjà"
msgid "You must either choose an existing user or create a new one properly"
msgstr ""
"Vous devez soit choisir un utilisateur existant, ou en créer un proprement."
-
-#~ msgid "You are trying to create a subscription without member"
-#~ msgstr "Vous essayez de créer une cotisation sans membre"
diff --git a/migrate.py b/migrate.py
index a1aa79a0..b22d902d 100644
--- a/migrate.py
+++ b/migrate.py
@@ -26,14 +26,7 @@ from subscription.models import Subscription, Subscriber
from eboutic.models import Invoice, InvoiceItem
from accounting.models import BankAccount, ClubAccount, GeneralJournal, Operation, AccountingType, Company, SimplifiedAccountingType
-db = MySQLdb.connect(
- host="ae-db",
- user="taiste_rw",
- passwd=input("password: "),
- db="ae2-taiste",
- charset='utf8',
- use_unicode=True)
-
+db = MySQLdb.connect(**settings.OLD_MYSQL_INFOS)
start = datetime.datetime.now()
def reset_index(*args):
@@ -245,6 +238,7 @@ def migrate_club():
user = User.objects.filter(id=m['id_utilisateur']).first()
if club and user:
new = Membership(
+ id=Membership.objects.count()+1,
club=club,
user=user,
start_date=m['date_debut'],
@@ -259,7 +253,7 @@ def migrate_club():
print("Clubs memberships migrated at %s" % datetime.datetime.now())
print("Running time: %s" % (datetime.datetime.now()-start))
- migrate_clubs()
+ # migrate_clubs()
migrate_club_memberships()
def migrate_subscriptions():
@@ -953,18 +947,18 @@ def migrate_accounting():
def main():
print("Start at %s" % start)
# Core
- migrate_core()
+ # migrate_core()
# Club
- migrate_club()
+ # migrate_club()
# Subscriptions
- migrate_subscriptions()
+ # migrate_subscriptions()
# Counters
- migrate_counter()
- check_accounts()
+ # migrate_counter()
+ # check_accounts()
# Accounting
- migrate_accounting()
+ # migrate_accounting()
reset_index('core', 'club', 'subscription', 'accounting', 'eboutic', 'launderette', 'counter')
- end = datetime.datetime.now()
+ # end = datetime.datetime.now()
print("End at %s" % end)
print("Running time: %s" % (end-start))