diff --git a/polynum/base/migrations/0027_auto__add_counter.py b/polynum/base/migrations/0027_auto__add_counter.py new file mode 100644 index 0000000..711eb11 --- /dev/null +++ b/polynum/base/migrations/0027_auto__add_counter.py @@ -0,0 +1,265 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as 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 'Counter' + db.create_table(u'base_counter', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('month', self.gf('django.db.models.fields.DateField')(unique=True)), + ('counter', self.gf('django.db.models.fields.IntegerField')(default=0)), + )) + db.send_create_signal('base', ['Counter']) + + + def backwards(self, orm): + # Deleting model 'Counter' + db.delete_table(u'base_counter') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'base.accountingcode': { + 'Meta': {'ordering': "('entity', 'code')", 'object_name': 'AccountingCode'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + 'entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Entity']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'base.action': { + 'Meta': {'ordering': "('name',)", 'object_name': 'Action'}, + 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'comment': ('django.db.models.fields.BooleanField', [], {}), + 'edit_pages_csv': ('polynum.base.fields.MultiSelectField', [], {'max_length': '1024', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'special_type': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'ui_message': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'validate_request': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.counter': { + 'Meta': {'object_name': 'Counter'}, + 'counter': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'month': ('django.db.models.fields.DateField', [], {'unique': 'True'}) + }, + 'base.deliveryplace': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DeliveryPlace'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentlicence': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentLicence'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'diffusion_tags': ('polynum.base.fields.MultiSelectField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'only_free_documents': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentusage': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentUsage'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'no_diffusion': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.entity': { + 'Meta': {'ordering': "('left_bound',)", 'object_name': 'Entity'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'depth': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'description_override': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.EntityType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'left_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'name_override': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children_set'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.Entity']"}), + 'right_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}) + }, + 'base.entitytype': { + 'Meta': {'object_name': 'EntityType'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.history': { + 'Meta': {'ordering': "('date',)", 'object_name': 'History'}, + 'action': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Action']", 'on_delete': 'models.PROTECT'}), + 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'new_status': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'on_delete': 'models.PROTECT', 'to': "orm['base.Status']"}), + 'old_status': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.Status']"}), + 'request': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Request']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + 'base.mailnotification': { + 'Meta': {'object_name': 'MailNotification'}, + 'action': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Action']"}), + 'body_template': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'subject_template': ('django.db.models.fields.TextField', [], {}), + 'to': ('django.db.models.fields.CharField', [], {'max_length': '16'}) + }, + 'base.polynumprofile': { + 'Meta': {'object_name': 'PolynumProfile'}, + 'accepted_cgu': ('django.db.models.fields.BooleanField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'phone': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '32'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) + }, + 'base.profile': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Profile'}, + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoption': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOption'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'list_type': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoptionchoice': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOptionChoice'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.ProfileOption']"}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.request': { + 'Meta': {'ordering': "('-creation_date', '-month_order')", 'object_name': 'Request'}, + 'base_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Profile']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'contact_bureau': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'contact_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'contact_telephone1': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'contact_telephone2': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'copies': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'null': 'True', 'blank': 'True'}), + 'copyright': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '7', 'decimal_places': '3', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'delivery_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 1, 31, 0, 0)', 'null': 'True', 'blank': 'True'}), + 'delivery_place': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DeliveryPlace']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'details': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Entity']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'financial_code': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '64', 'blank': 'True'}), + 'financial_comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_from_remote_request': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'licence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentLicence']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'modification_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'month_order': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), + 'name': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'nb_pages': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'blank': 'True'}), + 'sponsor': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Status']", 'on_delete': 'models.PROTECT'}), + 'uploadfile': ('django.db.models.fields.files.FileField', [], {'max_length': '512', 'blank': 'True'}), + 'usage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentUsage']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + 'base.role': { + 'Meta': {'object_name': 'Role'}, + 'id': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.roleassociation': { + 'Meta': {'object_name': 'RoleAssociation'}, + 'entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Entity']", 'on_delete': 'models.PROTECT'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'role': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Role']", 'on_delete': 'models.PROTECT'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + 'base.status': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Status'}, + 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'default': ('django.db.models.fields.BooleanField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end': ('django.db.models.fields.BooleanField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), + 'start': ('django.db.models.fields.BooleanField', [], {}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'visible_by': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.Role']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'base.transition': { + 'Meta': {'ordering': "('role', 'source')", 'unique_together': "(('role', 'source', 'action'),)", 'object_name': 'Transition'}, + 'action': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Action']", 'on_delete': 'models.PROTECT'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'destination': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'in_transitions'", 'on_delete': 'models.PROTECT', 'to': "orm['base.Status']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name_override': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'role': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Role']"}), + 'show_on_detail': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'out_transitions'", 'on_delete': 'models.PROTECT', 'to': "orm['base.Status']"}), + 'warn': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['base'] \ No newline at end of file diff --git a/polynum/base/models/request.py b/polynum/base/models/request.py index 4bd29b0..9dff048 100644 --- a/polynum/base/models/request.py +++ b/polynum/base/models/request.py @@ -157,6 +157,13 @@ class RequestQueryset(utils.QuerySet): total_cost += ((r.nb_pages * ppp) + ppd) * r.get_copies() return total_cost +class Counter(models.Model): + month = models.DateField(unique=True) + counter = models.IntegerField(default=0) + + class Meta: + app_label = 'base' + class Request(models.Model): COPYRIGHT_CHOICES = ( (False, _( @@ -296,12 +303,13 @@ class Request(models.Model): def save(self, *args, **kwargs): self.modification_date = now() if self.month_order == -1: - qs = Request.objects.filter(creation_date__year=self.creation_date.year, - creation_date__month=self.creation_date.month, - creation_date__lte=self.creation_date) \ - .exclude(creation_date=self.creation_date, month_order=-1) \ - .select_for_update() - self.month_order = qs.count() + 1 + date = self.creation_date.date() + date = date.replace(day=1) + counter, created = Counter.objects.get_or_create(month=date) + counter = Counter.objects.select_for_update().get(month=date) + counter.counter += 1 + counter.save() + self.month_order = counter.counter super(Request, self).save(*args, **kwargs) def act(self, who, workflow, description=None):