Commit 66fdf6cb authored by Skia's avatar Skia

Migrate and improve subscriptions

parent e1474c7a
Pipeline #116 failed with stage
in 3 minutes and 14 seconds
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounting', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='operation',
name='mode',
field=models.CharField(verbose_name='payment method', max_length=255, choices=[('CHECK', 'Check'), ('CASH', 'Cash'), ('TRANSFERT', 'Transfert'), ('CARD', 'Credit card')]),
),
]
......@@ -71,7 +71,7 @@
<td>
<ul>
{% for it in i.items.all() %}
<li>{{ it.product_name }} - {{ it.product_unit_price }}</li>
<li>{{ it.quantity }} x {{ it.product_name }} - {{ it.product_unit_price }}</li>
{% endfor %}
</ul>
</td>
......
......@@ -28,7 +28,7 @@
{% endif %}
{% if form.instance == user %}
<p><a href="{{ url('core:password_change') }}">{% trans %}Change my password{% endtrans %}</a></p>
{% elif user.is_root() %}
{% elif user.is_root %}
<p><a href="{{ url('core:password_root_change', user_id=form.instance.id) }}">{% trans %}Change user password{% endtrans %}</a></p>
{% endif %}
</form>
......
<div id="user_profile">
<div id="pictures">
{% if profile.profile_pict %}
<img src="{{ profile.profile_pict.get_download_url() }}" alt="{% trans %}Profile{% endtrans %}" />
{% endif %}
</div>
<p>{{ profile.get_full_name() }}</p>
{% if profile.nick_name %}
<p id="nickname">&laquo; {{ profile.nick_name }} &raquo;</p>
{% endif %}
{% if profile.date_of_birth %}
<p>{% trans %}Born: {% endtrans %}{{ profile.date_of_birth|date("d/m/Y") }}</p>
{% endif %}
{% if profile.promo %}
<p><img src="{{ static('core/img/promo_%02d.png' % profile.promo) }}" alt="Promo {{ profile.promo }}" class="promo_pict" />
{% trans %}Promo: {% endtrans %}{{ profile.promo }}</p>
{% endif %}
</div>
......@@ -25,6 +25,7 @@ urlpatterns = [
# User views
url(r'^user/$', UserListView.as_view(), name='user_list'),
url(r'^user/(?P<user_id>[0-9]+)/mini$', UserMiniView.as_view(), name='user_profile_mini'),
url(r'^user/(?P<user_id>[0-9]+)/$', UserView.as_view(), name='user_profile'),
url(r'^user/(?P<user_id>[0-9]+)/edit$', UserUpdateProfileView.as_view(), name='user_edit'),
url(r'^user/(?P<user_id>[0-9]+)/groups$', UserUpdateGroupView.as_view(), name='user_groups'),
......
......@@ -50,7 +50,6 @@ class SelectFile(TextInput):
'name': name,
}
output += '<span name="' + name + '" class="choose_file_button">' + _("Choose file") + '</span>'
print(output)
return output
# Forms
......
......@@ -121,6 +121,15 @@ class UserView(CanViewMixin, DetailView):
context_object_name = "profile"
template_name = "core/user_detail.jinja"
class UserMiniView(CanViewMixin, DetailView):
"""
Display a user's profile
"""
model = User
pk_url_kwarg = "user_id"
context_object_name = "profile"
template_name = "core/user_mini.jinja"
class UserListView(ListView):
"""
Displays the user list
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('counter', '0002_auto_20160810_1348'),
]
operations = [
migrations.AlterField(
model_name='refilling',
name='payment_method',
field=models.CharField(verbose_name='payment method', default='cash', max_length=255, choices=[('CHECK', 'Check'), ('CASH', 'Cash')]),
),
]
......@@ -30,7 +30,7 @@ class Customer(models.Model):
ordering = ['account_id',]
def __str__(self):
return self.user.username
return "%s - %s" % (self.user.username, self.account_id)
def generate_account_id(number):
number = str(number)
......
......@@ -5,7 +5,7 @@
{% endblock %}
{% block content %}
{% if request.user.is_in_group(settings.SITH_GROUPS['launderette-admin']['name']) %}
{% if request.user.is_root %}
<p><a href="{{ url('core:page_edit', page_name=page.get_full_name()) }}">{% trans %}Edit presentation page{% endtrans %}</a></p>
{% endif %}
{% if request.user.is_in_group(settings.SITH_MAIN_MEMBERS_GROUP) %}
......
This diff is collapsed.
......@@ -16,6 +16,8 @@ from django.db import connection
from core.models import User, SithFile
from club.models import Club, Membership
from counter.models import Customer
from subscription.models import Subscription, Subscriber
db = MySQLdb.connect(
host="ae-db",
......@@ -87,15 +89,15 @@ def migrate_users():
c.execute("""
SELECT *
FROM utilisateurs utl
JOIN utl_etu ue
LEFT JOIN utl_etu ue
ON ue.id_utilisateur = utl.id_utilisateur
JOIN utl_etu_utbm ueu
LEFT JOIN utl_etu_utbm ueu
ON ueu.id_utilisateur = utl.id_utilisateur
JOIN utl_extra uxtra
LEFT JOIN utl_extra uxtra
ON uxtra.id_utilisateur = utl.id_utilisateur
JOIN loc_ville ville
LEFT JOIN loc_ville ville
ON utl.id_ville = ville.id_ville
-- WHERE utl.id_utilisateur > 9000
-- WHERE utl.id_utilisateur = 9248
""")
User.objects.filter(id__gt=0).delete()
print("Users deleted")
......@@ -237,12 +239,88 @@ def migrate_club_memberships():
print("FAIL for club membership %s: %s" % (m['id_asso'], repr(e)))
cur.close()
def migrate_subscriptions():
LOCATION = {
5: "SEVENANS",
6: "BELFORT",
9: "MONTBELIARD",
None: "SEVENANS",
}
TYPE = {
0: 'un-semestre',
1: 'deux-semestres',
2: 'cursus-tronc-commun',
3: 'cursus-branche',
4: 'membre-honoraire',
5: 'assidu',
6: 'amicale/doceo',
7: 'reseau-ut',
8: 'crous',
9: 'sbarro/esta',
10: 'cursus-alternant',
None: 'un-semestre',
}
PAYMENT = {
1: "CHECK",
2: "CARD",
3: "CASH",
4: "OTHER",
5: "EBOUTIC",
0: "OTHER",
}
cur = db.cursor(MySQLdb.cursors.DictCursor)
cur.execute("""
SELECT *
FROM ae_cotisations
""")
Subscription.objects.all().delete()
print("Subscriptions deleted")
Customer.objects.all().delete()
print("Customers deleted")
for r in cur.fetchall():
try:
user = Subscriber.objects.filter(id=r['id_utilisateur']).first()
if user:
new = Subscription(
id=r['id_cotisation'],
member=user,
subscription_start=r['date_cotis'],
subscription_end=r['date_fin_cotis'],
subscription_type=TYPE[r['type_cotis']],
payment_method=PAYMENT[r['mode_paiement_cotis']],
location=LOCATION[r['id_comptoir']],
)
new.save()
except Exception as e:
print("FAIL for subscription %s: %s" % (r['id_cotisation'], repr(e)))
cur.close()
def update_customer_account():
cur = db.cursor(MySQLdb.cursors.DictCursor)
cur.execute("""
SELECT *
FROM ae_carte carte
JOIN ae_cotisations cotis
ON carte.id_cotisation = cotis.id_cotisation
""")
for r in cur.fetchall():
try:
user = Customer.objects.filter(user_id=r['id_utilisateur']).first()
if user:
user.account_id = str(r['id_carte_ae']) + r['cle_carteae'].lower()
user.save()
except Exception as e:
print("FAIL to update customer account for %s: %s" % (r['id_cotisation'], repr(e)))
cur.close()
def main():
# migrate_users()
# migrate_profile_pict()
# migrate_clubs()
migrate_users()
migrate_profile_pict()
migrate_clubs()
migrate_club_memberships()
migrate_subscriptions()
update_customer_account()
if __name__ == "__main__":
main()
......@@ -243,10 +243,6 @@ SITH_GROUPS = {
'id': 5,
'name': "Counter admin",
},
'launderette-admin': {
'id': 6,
'name': "Launderette admin",
},
}
SITH_BOARD_SUFFIX="-bureau"
......@@ -256,15 +252,17 @@ SITH_MAIN_BOARD_GROUP=SITH_MAIN_CLUB['unix_name']+SITH_BOARD_SUFFIX
SITH_MAIN_MEMBERS_GROUP=SITH_MAIN_CLUB['unix_name']+SITH_MEMBER_SUFFIX
SITH_ACCOUNTING_PAYMENT_METHOD = [
('CHEQUE', _('Check')),
('CHECK', _('Check')),
('CASH', _('Cash')),
('TRANSFert', _('Transfert')),
('TRANSFERT', _('Transfert')),
('CARD', _('Credit card')),
]
SITH_SUBSCRIPTION_PAYMENT_METHOD = [
('CHEQUE', _('Check')),
('CHECK', _('Check')),
('CARD', _('Credit card')),
('CASH', _('Cash')),
('EBOUTIC', _('Eboutic')),
('OTHER', _('Other')),
]
......@@ -281,7 +279,7 @@ SITH_COUNTER_BARS = [
]
SITH_COUNTER_PAYMENT_METHOD = [
('CHEQUE', _('Check')),
('CHECK', _('Check')),
('CASH', _('Cash')),
]
......@@ -292,7 +290,8 @@ SITH_COUNTER_BANK = [
('CREDIT-MUTUEL', 'Credit Mutuel'),
]
# Subscription durations are in semestres (should be settingized)
# Subscription durations are in semestres
# Be careful, modifying this parameter will need a migration to be applied
SITH_SUBSCRIPTIONS = {
'un-semestre': {
'name': _('One semester'),
......@@ -314,6 +313,41 @@ SITH_SUBSCRIPTIONS = {
'price': 45,
'duration': 6,
},
'cursus-alternant': {
'name': _('Branch cursus'),
'price': 30,
'duration': 6,
},
'membre-honoraire': {
'name': _('Honorary member'),
'price': 0,
'duration': 666,
},
'assidu': {
'name': _('Assidu member'),
'price': 0,
'duration': 2,
},
'amicale/doceo': {
'name': _('Amicale/DOCEO member'),
'price': 0,
'duration': 2,
},
'reseau-ut': {
'name': _('UT network member'),
'price': 0,
'duration': 1,
},
'crous': {
'name': _('CROUS member'),
'price': 0,
'duration': 2,
},
'sbarro/esta': {
'name': _('Sbarro/ESTA member'),
'price': 15,
'duration': 2,
},
# To be completed....
}
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('subscription', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='subscription',
name='payment_method',
field=models.CharField(verbose_name='payment method', max_length=255, choices=[('CHECK', 'Check'), ('CARD', 'Credit card'), ('CASH', 'Cash'), ('EBOUTIC', 'Eboutic'), ('OTHER', 'Other')]),
),
migrations.AlterField(
model_name='subscription',
name='subscription_type',
field=models.CharField(verbose_name='subscription type', max_length=255, choices=[('amicale/doceo', 'Amicale/DOCEO member'), ('assidu', 'Assidu member'), ('crous', 'CROUS member'), ('cursus-alternant', 'Branch cursus'), ('cursus-branche', 'Branch cursus'), ('cursus-tronc-commun', 'Common core cursus'), ('deux-semestres', 'Two semesters'), ('membre-honoraire', 'Honorary member'), ('reseau-ut', 'UT network member'), ('sbarro/esta', 'Sbarro/ESTA member'), ('un-semestre', 'One semester')]),
),
]
......@@ -53,7 +53,8 @@ class Subscription(models.Model):
super(Subscription, self).save()
from counter.models import Customer
if not Customer.objects.filter(user=self.member).exists():
Customer(user=self.member, account_id=Customer.generate_account_id(self.id), amount=0).save()
last_id = Customer.objects.count() + 5195 # Number to keep a continuity with the old site
Customer(user=self.member, account_id=Customer.generate_account_id(last_id+1), amount=0).save()
self.member.make_home()
def get_absolute_url(self):
......
......@@ -6,9 +6,41 @@
{% block content %}
<h3>{% trans %}New subscription{% endtrans %}</h3>
<form action="" method="post">
<div id="user_info"></div>
<form action="" method="post" id="subscription_form">
{% csrf_token %}
{{ form.as_p() }}
<p>{{ form.member.errors }}<label for="{{ form.member.name }}">{{ form.member.label }}</label> {{ form.member }}</p>
<div id="new_member">
<p>{{ form.last_name.errors }}<label for="{{ form.last_name.name }}">{{ form.last_name.label }}</label> {{ form.last_name }}</p>
<p>{{ form.first_name.errors }}<label for="{{ form.first_name.name }}">{{ form.first_name.label }}</label> {{ form.first_name }}</p>
<p>{{ form.email.errors }}<label for="{{ form.email.name }}">{{ form.email.label }}</label> {{ form.email }}</p>
</div>
<p>{{ form.subscription_type.errors }}<label for="{{ form.subscription_type.name }}">{{ form.subscription_type.label }}</label> {{ form.subscription_type }}</p>
<p>{{ form.payment_method.errors }}<label for="{{ form.payment_method.name }}">{{ form.payment_method.label }}</label> {{
form.payment_method }}</p>
<p>{{ form.location.errors }}<label for="{{ form.location.name }}">{{ form.location.label }}</label> {{ form.location }}</p>
<p><input type="submit" value="{% trans %}Save{% endtrans %}" /></p>
</form>
{% endblock %}
{% block script %}
{{ super() }}
<script type="text/javascript" charset="utf-8">
$( function() {
select = $("#subscription_form select[name=member]");
member_block = $("#subscription_form #new_member");
user_info = $("#user_info");
function display_new_member() {
if (select.val()) {
member_block.hide();
user_info.load("/user/"+select.val()+"/mini");
} else {
member_block.show();
user_info.empty();
}
}
select.on("change", display_new_member);
display_new_member();
} );
</script>
{% endblock %}
......@@ -63,8 +63,8 @@ class NewSubscription(CanEditMixin, CreateView):
def get_initial(self):
if 'member' in self.request.GET.keys():
return {'member': self.request.GET['member']}
return {}
return {'member': self.request.GET['member'], 'subscription_type': 'deux-semestres'}
return {'subscription_type': 'deux-semestres'}
def form_valid(self, form):
form.instance.subscription_start = Subscription.compute_start(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment