Browse Source

Merge branch 'offers_app'

Fabs 11 years ago
parent
commit
acfd17dcd4

+ 1 - 0
.gitignore

@@ -3,3 +3,4 @@
 *.swp
 .svn
 coin/settings_local.py
+.DS_Store

+ 2 - 13
coin/members/admin.py

@@ -3,6 +3,7 @@ from django.contrib import admin
 from coin.members.models import Member, CryptoKey, LdapUser, MembershipFee
 from django import forms
 from coin.members.membershipfee_filter import MembershipFeeFilter
+import autocomplete_light
 
 # class LdapUserAdmin(admin.ModelAdmin):
 #    exclude = ['dn']
@@ -23,17 +24,6 @@ class MembershipFeeInline(admin.TabularInline):
     fields = ('start_date', 'end_date', 'amount')
 
 
-class MemberAdminForm(forms.ModelForm):
-    # password = forms.CharField(widget=forms.PasswordInput(), required=False)
-
-    def clean(self):
-        cleaned_data = super(MemberAdminForm, self).clean()
-        return cleaned_data
-
-    class Meta:
-        model = Member
-
-
 class MemberAdmin(admin.ModelAdmin):
     list_display = ('id', 'status', 'first_name', 'last_name',
                     'organization_name', 'email', 'end_date_of_membership')
@@ -57,7 +47,6 @@ class MemberAdmin(admin.ModelAdmin):
 
     save_on_top = True
 
-    form = MemberAdminForm
     inlines = [CryptoKeyInline, MembershipFeeInline]
     
     def get_readonly_fields(self, request, obj=None):
@@ -83,7 +72,7 @@ class MemberAdmin(admin.ModelAdmin):
 
 class MembershipFeeAdmin(admin.ModelAdmin):
     list_display = ('member', 'end_date', 'amount')
-
+    form = autocomplete_light.modelform_factory(MembershipFee)
 
 admin.site.register(Member, MemberAdmin)
 admin.site.register(MembershipFee, MembershipFeeAdmin)

+ 11 - 0
coin/members/autocomplete_light_registry.py

@@ -0,0 +1,11 @@
+import autocomplete_light
+from models import Member
+
+# This will generate a MemberAutocomplete class
+autocomplete_light.register(Member,
+    # Just like in ModelAdmin.search_fields
+    search_fields=['^first_name', 'last_name'],
+    # This will actually data-minimum-characters which will set
+    # widget.autocomplete.minimumCharacters.
+    autocomplete_js_attributes={'placeholder': 'Other model name ?',},
+)

+ 2 - 0
coin/members/tests.py

@@ -183,6 +183,8 @@ class MemberAdminTests(TestCase):
         self.assertNotContains(edit_page,
             '''<input id="id_ldap_cn" />''',
             html=True)
+        
+        LdapUser.objects.get(pk=ldap_cn).delete();
 
 class MemberTestsUtils(object):
     @staticmethod

+ 0 - 0
coin/offers/__init__.py


+ 39 - 0
coin/offers/admin.py

@@ -0,0 +1,39 @@
+from django.contrib import admin
+from coin.offers.models import Offer, Service, OfferSubscription
+from coin.offers.offersubscription_filter import\
+            OfferSubscriptionTerminationFilter,\
+            OfferSubscriptionCommitmentFilter
+import autocomplete_light
+
+class ServiceAdmin(admin.ModelAdmin):
+    search_fields = ['name']
+
+
+class OfferAdmin(admin.ModelAdmin):
+    list_display = ('service', 'name', 'billing_period', 'period_fees',
+                    'initial_fees')
+    list_display_links = ('name',)
+    search_fields = ['name']
+
+
+class OfferSubscriptionAdmin(admin.ModelAdmin):
+    list_display = ('member', 'offer', 'subscription_date', 'commitment',
+                    'resign_date')
+    list_display_links = ('member','offer')
+    list_filter = ( OfferSubscriptionTerminationFilter,
+                    OfferSubscriptionCommitmentFilter,
+                    'member', 'offer')
+    search_fields = ['member__first_name', 'member__last_name', 'member__email']
+    
+    fields = (
+                'member',
+                'offer',
+                'subscription_date',
+                'commitment',
+                'resign_date'
+             )
+    form = autocomplete_light.modelform_factory(OfferSubscription)
+
+admin.site.register(Service, ServiceAdmin)
+admin.site.register(Offer, OfferAdmin)
+admin.site.register(OfferSubscription, OfferSubscriptionAdmin)

+ 97 - 0
coin/offers/migrations/0001_initial.py

@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'Service'
+        db.create_table(u'offers_service', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
+        ))
+        db.send_create_signal(u'offers', ['Service'])
+
+        # Adding model 'Offer'
+        db.create_table(u'offers_offer', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('biling_priod', self.gf('django.db.models.fields.IntegerField')(default=1)),
+            ('period_fees', self.gf('django.db.models.fields.DecimalField')(max_digits=5, decimal_places=2)),
+            ('initial_fees', self.gf('django.db.models.fields.DecimalField')(max_digits=5, decimal_places=2)),
+            ('service', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['offers.Service'])),
+        ))
+        db.send_create_signal(u'offers', ['Offer'])
+
+        # Adding model 'OfferSubscription'
+        db.create_table(u'offers_offersubscription', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('subscription_date', self.gf('django.db.models.fields.DateField')(default=datetime.date.today)),
+            ('resign_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)),
+            ('commitment', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
+            ('member', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['members.Member'])),
+            ('offer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['offers.Offer'])),
+        ))
+        db.send_create_signal(u'offers', ['OfferSubscription'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'Service'
+        db.delete_table(u'offers_service')
+
+        # Deleting model 'Offer'
+        db.delete_table(u'offers_offer')
+
+        # Deleting model 'OfferSubscription'
+        db.delete_table(u'offers_offersubscription')
+
+
+    models = {
+        u'members.member': {
+            'Meta': {'object_name': 'Member'},
+            'address': ('django.db.models.fields.TextField', [], {}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'country': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '254'}),
+            'entry_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'ldap_cn': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'mobile_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            'organization_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'non_adherent'", 'max_length': '50'}),
+            'type': ('django.db.models.fields.CharField', [], {'default': "'personne_physique'", 'max_length': '20'})
+        },
+        u'offers.offer': {
+            'Meta': {'object_name': 'Offer'},
+            'biling_priod': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'initial_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'period_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'service': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Service']"})
+        },
+        u'offers.offersubscription': {
+            'Meta': {'object_name': 'OfferSubscription'},
+            'commitment': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['members.Member']"}),
+            'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Offer']"}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'subscription_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        },
+        u'offers.service': {
+            'Meta': {'object_name': 'Service'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        }
+    }
+
+    complete_apps = ['offers']

+ 75 - 0
coin/offers/migrations/0002_auto__del_field_offer_biling_priod__add_field_offer_billing_priod.py

@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Deleting field 'Offer.biling_priod'
+        db.delete_column(u'offers_offer', 'biling_priod')
+
+        # Adding field 'Offer.billing_priod'
+        db.add_column(u'offers_offer', 'billing_priod',
+                      self.gf('django.db.models.fields.IntegerField')(default=1),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Adding field 'Offer.biling_priod'
+        db.add_column(u'offers_offer', 'biling_priod',
+                      self.gf('django.db.models.fields.IntegerField')(default=1),
+                      keep_default=False)
+
+        # Deleting field 'Offer.billing_priod'
+        db.delete_column(u'offers_offer', 'billing_priod')
+
+
+    models = {
+        u'members.member': {
+            'Meta': {'object_name': 'Member'},
+            'address': ('django.db.models.fields.TextField', [], {}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'country': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '254'}),
+            'entry_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'ldap_cn': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'mobile_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            'organization_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'non_adherent'", 'max_length': '50'}),
+            'type': ('django.db.models.fields.CharField', [], {'default': "'personne_physique'", 'max_length': '20'})
+        },
+        u'offers.offer': {
+            'Meta': {'object_name': 'Offer'},
+            'billing_priod': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'initial_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'period_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'service': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Service']"})
+        },
+        u'offers.offersubscription': {
+            'Meta': {'object_name': 'OfferSubscription'},
+            'commitment': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['members.Member']"}),
+            'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Offer']"}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'subscription_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        },
+        u'offers.service': {
+            'Meta': {'object_name': 'Service'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        }
+    }
+
+    complete_apps = ['offers']

+ 75 - 0
coin/offers/migrations/0003_auto__del_field_offer_billing_priod__add_field_offer_billing_period.py

@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Deleting field 'Offer.billing_priod'
+        db.delete_column(u'offers_offer', 'billing_priod')
+
+        # Adding field 'Offer.billing_period'
+        db.add_column(u'offers_offer', 'billing_period',
+                      self.gf('django.db.models.fields.IntegerField')(default=1),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Adding field 'Offer.billing_priod'
+        db.add_column(u'offers_offer', 'billing_priod',
+                      self.gf('django.db.models.fields.IntegerField')(default=1),
+                      keep_default=False)
+
+        # Deleting field 'Offer.billing_period'
+        db.delete_column(u'offers_offer', 'billing_period')
+
+
+    models = {
+        u'members.member': {
+            'Meta': {'object_name': 'Member'},
+            'address': ('django.db.models.fields.TextField', [], {}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'country': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '254'}),
+            'entry_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'ldap_cn': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'mobile_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            'organization_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'non_adherent'", 'max_length': '50'}),
+            'type': ('django.db.models.fields.CharField', [], {'default': "'personne_physique'", 'max_length': '20'})
+        },
+        u'offers.offer': {
+            'Meta': {'object_name': 'Offer'},
+            'billing_period': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'initial_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'period_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'service': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Service']"})
+        },
+        u'offers.offersubscription': {
+            'Meta': {'object_name': 'OfferSubscription'},
+            'commitment': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['members.Member']"}),
+            'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Offer']"}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'subscription_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        },
+        u'offers.service': {
+            'Meta': {'object_name': 'Service'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        }
+    }
+
+    complete_apps = ['offers']

+ 65 - 0
coin/offers/migrations/0004_auto__chg_field_offersubscription_commitment.py

@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+
+        # Changing field 'OfferSubscription.commitment'
+        db.alter_column(u'offers_offersubscription', 'commitment', self.gf('django.db.models.fields.IntegerField')())
+
+    def backwards(self, orm):
+
+        # Changing field 'OfferSubscription.commitment'
+        db.alter_column(u'offers_offersubscription', 'commitment', self.gf('django.db.models.fields.IntegerField')(null=True))
+
+    models = {
+        u'members.member': {
+            'Meta': {'object_name': 'Member'},
+            'address': ('django.db.models.fields.TextField', [], {}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'country': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '254'}),
+            'entry_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'ldap_cn': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'mobile_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            'organization_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'non_adherent'", 'max_length': '50'}),
+            'type': ('django.db.models.fields.CharField', [], {'default': "'personne_physique'", 'max_length': '20'})
+        },
+        u'offers.offer': {
+            'Meta': {'object_name': 'Offer'},
+            'billing_period': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'initial_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'period_fees': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
+            'service': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Service']"})
+        },
+        u'offers.offersubscription': {
+            'Meta': {'object_name': 'OfferSubscription'},
+            'commitment': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['members.Member']"}),
+            'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['offers.Offer']"}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'subscription_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        },
+        u'offers.service': {
+            'Meta': {'object_name': 'Service'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        }
+    }
+
+    complete_apps = ['offers']

+ 0 - 0
coin/offers/migrations/__init__.py


+ 61 - 0
coin/offers/models.py

@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+import datetime
+from django.db import models
+
+
+class Service(models.Model):
+    name = models.CharField(max_length=255, blank=False, null=False,
+                            verbose_name='Nom du service')
+    
+    def __unicode__(self):
+        return self.name
+
+
+class Offer(models.Model):
+    name = models.CharField(max_length=255, blank=False, null=False,
+                            verbose_name='Nom de l\'offre')
+    billing_period = models.IntegerField(blank=False, null=False, default=1,
+                                         verbose_name='Période de facturation',
+                                         help_text='en mois')
+    period_fees = models.DecimalField(max_digits=5, decimal_places=2,
+                                      blank=False, null=False,
+                                      verbose_name='Montant par période de '
+                                                   'facturation',
+                                      help_text='en €')
+    initial_fees = models.DecimalField(max_digits=5, decimal_places=2,
+                                      blank=False, null=False,
+                                      verbose_name='Frais de mise en service',
+                                      help_text='en €')
+    service = models.ForeignKey('Service')
+    
+    def __unicode__(self):
+        return u'%s - %d€ / %im [%s]' % (self.name, self.period_fees,
+                                          self.billing_period, self.service)
+
+    class Meta:
+        verbose_name = 'offre'
+
+
+class OfferSubscription(models.Model):
+    subscription_date = models.DateField(
+        null=False,
+        blank=False,
+        default=datetime.date.today,
+        verbose_name='Date de souscription à l\'offre')
+    resign_date = models.DateField(
+        null=True,
+        blank=True,
+        verbose_name='Date de résiliation')
+    commitment = models.IntegerField(blank=False, null=False,
+                                     verbose_name='Période d\'engagement',
+                                     help_text = 'en mois',
+                                     default=0)
+    member = models.ForeignKey('members.Member', verbose_name='Membre')
+    offer = models.ForeignKey('Offer', verbose_name='Offre')
+
+    def __unicode__(self):
+        return u'%s - %s - %s' % (self.member, self.offer.name,
+                                   self.subscription_date)
+
+    class Meta:
+        verbose_name = 'abonnement'

+ 43 - 0
coin/offers/offersubscription_filter.py

@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+from django.contrib.admin import SimpleListFilter
+from django.db.models import Q,F
+import datetime
+
+
+class OfferSubscriptionTerminationFilter(SimpleListFilter):
+    title = 'Abonnement'
+    parameter_name = 'termination'
+
+    def lookups(self, request, model_admin):
+        return (
+            ('not_terminated', u'Abonnements en cours'),
+            ('terminated', u'Abonnements résiliés'),
+        )
+
+    def queryset(self, request, queryset):
+        if self.value() == 'not_terminated':
+            return queryset.filter(Q(resign_date__gt=datetime.date.today) | Q(resign_date__isnull=True))
+        if self.value() == 'terminated':
+            return queryset.filter(resign_date__lte=datetime.date.today)
+
+
+class OfferSubscriptionCommitmentFilter(SimpleListFilter):
+    title = u'Engagement'
+    parameter_name = 'commitment'
+
+    def lookups(self, request, model_admin):
+        return (
+            ('committed', u'Est engagé'),
+            ('not_committed', u'N\'est plus engagé'),
+        )
+
+    def queryset(self, request, queryset):
+        if self.value() == 'committed':
+            # TODO : Faire mieux que du SQL écrit en dur. La ligne 
+            # en dessous ne fonctionne pas et je ne sais pas pourquoi
+            return queryset.extra(where = ["subscription_date + INTERVAL '1 month' * commitment > current_date"])
+            #~ return queryset.filter(subscription_date__gte=datetime.date.today - relativedelta(months=F('commitment'))) 
+        if self.value() == 'not_committed':
+            return queryset.extra(where = ["subscription_date + INTERVAL '1 month' * commitment <= current_date"])
+            #~ return queryset.filter(subscription_date__lte=datetime.date.today - relativedelta(months=F('commitment'))) 
+

+ 3 - 0
coin/offers/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 3 - 0
coin/offers/views.py

@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.

+ 3 - 1
coin/settings.py

@@ -141,7 +141,9 @@ INSTALLED_APPS = (
     #'django.contrib.admindocs',
     'south',
     'ldapdb',  # LDAP as database backend
-    'coin.members'
+    'autocomplete_light', #Automagic autocomplete foreingkey form component
+    'coin.members',
+    'coin.offers'
 )
 
 # A sample logging configuration. The only tangible logging

+ 5 - 0
coin/templates/admin/base_site.html

@@ -1,6 +1,11 @@
 {% extends "admin/base.html" %}
 {% load i18n %}
 
+{% block extrahead %}
+    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.js" type="text/javascript"></script>
+    {% include 'autocomplete_light/static.html' %}
+{% endblock %}
+
 {% block title %}COIN ☺ Admin{% endblock %}
 
 {% block branding %}

+ 9 - 2
coin/urls.py

@@ -1,6 +1,9 @@
 from django.conf.urls import patterns, include, url
-from django.contrib import admin
 
+import autocomplete_light
+autocomplete_light.autodiscover()
+
+from django.contrib import admin
 admin.autodiscover()
 
 urlpatterns = patterns(
@@ -15,5 +18,9 @@ urlpatterns = patterns(
     url(r'^members/', include('coin.members.urls', namespace='members')),
 
     url(r'^admin/', include(admin.site.urls)),
-    #url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+    
+    url(r'^autocomplete/', include('autocomplete_light.urls')),
+
 )

+ 2 - 0
requirements.txt

@@ -4,3 +4,5 @@ django-auth-ldap==1.1.4
 psycopg2==2.5.1
 python-ldap==2.4.13
 wsgiref==0.1.2
+python-dateutil==2.2
+django-autocomplete-light==2.0.0a8