Revision 164e64d5

b/astakosclient/astakosclient/tests.py
477 477

  
478 478
commission_description = {
479 479
    "serial": 57,
480
    "issue_time": "2013-04-08T10:19:15.0373",
480
    "issue_time": "2013-04-08T10:19:15.0373+00:00",
481 481
    "name": "a commission",
482 482
    "provisions": [
483 483
        {
b/docs/quota-api-guide.rst
353 353

  
354 354
  {
355 355
      "serial": 57,
356
      "issue_time": "2013-04-08T10:19:15.0373",
356
      "issue_time": "2013-04-08T10:19:15.0373+00:00",
357 357
      "name": "an optional description",
358 358
      "provisions": [
359 359
          {
b/snf-astakos-app/astakos/quotaholder_app/callpoint.py
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33 33

  
34
from datetime import datetime
34 35
from django.db.models import F
35 36
from astakos.quotaholder_app.exception import (
36 37
    QuotaholderError,
......
43 44
    Import, Release, Operations, finalize, undo)
44 45

  
45 46
from astakos.quotaholder_app.models import (
46
    Holding, Commission, Provision, ProvisionLog, now)
47
    Holding, Commission, Provision, ProvisionLog)
47 48

  
48 49

  
49 50
def get_quota(holders=None, sources=None, resources=None):
......
165 166

  
166 167
    commission = Commission.objects.create(clientkey=clientkey,
167 168
                                           name=name,
168
                                           issue_time=now())
169
                                           issue_datetime=datetime.now())
169 170
    for (holder, source, resource), quantity in provisions_to_create:
170 171
        Provision.objects.create(serial=commission,
171 172
                                 holder=holder,
......
176 177
    return commission.serial
177 178

  
178 179

  
179
def _log_provision(commission, provision, holding, log_time, reason):
180
def _log_provision(commission, provision, holding, log_datetime, reason):
180 181

  
181 182
    kwargs = {
182 183
        'serial':              commission.serial,
......
188 189
        'usage_min':           holding.usage_min,
189 190
        'usage_max':           holding.usage_max,
190 191
        'delta_quantity':      provision.quantity,
191
        'issue_time':          commission.issue_time,
192
        'log_time':            log_time,
192
        'issue_datetime':      commission.issue_datetime,
193
        'log_datetime':        log_datetime,
193 194
        'reason':              reason,
194 195
    }
195 196

  
......
240 241
    holdings = _get_holdings_for_update(holding_keys)
241 242
    provisions = _partition_by(lambda p: p.serial_id, ps)
242 243

  
243
    log_time = now()
244
    log_datetime = datetime.now()
244 245

  
245 246
    accepted, rejected, notFound = [], [], []
246 247
    for serial, accept in actions.iteritems():
......
267 268

  
268 269
            prefix = 'ACCEPT:' if accept else 'REJECT:'
269 270
            comm_reason = prefix + reason[-121:]
270
            _log_provision(commission, pv, h, log_time, comm_reason)
271
            _log_provision(commission, pv, h, log_datetime, comm_reason)
271 272
            pv.delete()
272 273
        commission.delete()
273 274
    return accepted, rejected, notFound, conflicting
......
306 307

  
307 308
    response = {'serial':     serial,
308 309
                'provisions': ps,
309
                'issue_time': commission.issue_time,
310
                'issue_time': commission.issue_datetime,
310 311
                'name':       commission.name,
311 312
                }
312 313
    return response
b/snf-astakos-app/astakos/quotaholder_app/migrations/0005_auto__add_field_commission_issue_datetime__add_field_provisionlog_issu.py
1
# encoding: utf-8
2
import datetime
3
from south.db import db
4
from south.v2 import SchemaMigration
5
from django.db import models
6

  
7
class Migration(SchemaMigration):
8

  
9
    def forwards(self, orm):
10
        
11
        # Adding field 'Commission.issue_datetime'
12
        db.add_column('quotaholder_app_commission', 'issue_datetime', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 1, 1, 0, 0, 0)), keep_default=False)
13

  
14
        # Adding field 'ProvisionLog.issue_datetime'
15
        db.add_column('quotaholder_app_provisionlog', 'issue_datetime', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 1, 1, 0, 0, 0)), keep_default=False)
16

  
17
        # Adding field 'ProvisionLog.log_datetime'
18
        db.add_column('quotaholder_app_provisionlog', 'log_datetime', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 1, 1, 0, 0, 0)), keep_default=False)
19

  
20

  
21
    def backwards(self, orm):
22
        
23
        # Deleting field 'Commission.issue_datetime'
24
        db.delete_column('quotaholder_app_commission', 'issue_datetime')
25

  
26
        # Deleting field 'ProvisionLog.issue_datetime'
27
        db.delete_column('quotaholder_app_provisionlog', 'issue_datetime')
28

  
29
        # Deleting field 'ProvisionLog.log_datetime'
30
        db.delete_column('quotaholder_app_provisionlog', 'log_datetime')
31

  
32

  
33
    models = {
34
        'quotaholder_app.commission': {
35
            'Meta': {'object_name': 'Commission'},
36
            'clientkey': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
37
            'issue_datetime': ('django.db.models.fields.DateTimeField', [], {}),
38
            'issue_time': ('django.db.models.fields.CharField', [], {'max_length': '24'}),
39
            'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '4096'}),
40
            'serial': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
41
        },
42
        'quotaholder_app.holding': {
43
            'Meta': {'unique_together': "(('holder', 'source', 'resource'),)", 'object_name': 'Holding'},
44
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'db_index': 'True'}),
45
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46
            'limit': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
47
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
48
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
49
            'usage_max': ('snf_django.lib.db.fields.IntDecimalField', [], {'default': '0', 'max_digits': '38', 'decimal_places': '0'}),
50
            'usage_min': ('snf_django.lib.db.fields.IntDecimalField', [], {'default': '0', 'max_digits': '38', 'decimal_places': '0'})
51
        },
52
        'quotaholder_app.provision': {
53
            'Meta': {'object_name': 'Provision'},
54
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'db_index': 'True'}),
55
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
56
            'quantity': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
57
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
58
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'provisions'", 'to': "orm['quotaholder_app.Commission']"}),
59
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'})
60
        },
61
        'quotaholder_app.provisionlog': {
62
            'Meta': {'object_name': 'ProvisionLog'},
63
            'delta_quantity': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
64
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
65
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
66
            'issue_datetime': ('django.db.models.fields.DateTimeField', [], {}),
67
            'issue_time': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
68
            'limit': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
69
            'log_datetime': ('django.db.models.fields.DateTimeField', [], {}),
70
            'log_time': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
71
            'name': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
72
            'reason': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
73
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
74
            'serial': ('django.db.models.fields.BigIntegerField', [], {}),
75
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
76
            'usage_max': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
77
            'usage_min': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'})
78
        }
79
    }
80

  
81
    complete_apps = ['quotaholder_app']
b/snf-astakos-app/astakos/quotaholder_app/migrations/0006_datetime.py
1
# encoding: utf-8
2
import datetime
3
from south.db import db
4
from south.v2 import DataMigration
5
from django.db import models
6

  
7

  
8
class Migration(DataMigration):
9

  
10
    def forwards(self, orm):
11
        parse = lambda s: datetime.datetime.strptime(s, '%Y-%m-%dT%H:%M:%S.%f')
12

  
13
        commissions = orm.Commission.objects.all()
14
        for commission in commissions:
15
            dt = parse(commission.issue_time)
16
            commission.issue_datetime = dt
17
            commission.save()
18

  
19
        plogs = orm.ProvisionLog.objects.all()
20
        for plog in plogs:
21
            issue_dt = parse(plog.issue_time)
22
            plog.issue_datetime = issue_dt
23
            log_dt = parse(plog.log_time)
24
            plog.log_datetime = log_dt
25
            plog.save()
26

  
27
    def backwards(self, orm):
28
        "Write your backwards methods here."
29

  
30

  
31
    models = {
32
        'quotaholder_app.commission': {
33
            'Meta': {'object_name': 'Commission'},
34
            'clientkey': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
35
            'issue_datetime': ('django.db.models.fields.DateTimeField', [], {}),
36
            'issue_time': ('django.db.models.fields.CharField', [], {'max_length': '24'}),
37
            'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '4096'}),
38
            'serial': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
39
        },
40
        'quotaholder_app.holding': {
41
            'Meta': {'unique_together': "(('holder', 'source', 'resource'),)", 'object_name': 'Holding'},
42
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'db_index': 'True'}),
43
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
44
            'limit': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
45
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
46
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
47
            'usage_max': ('snf_django.lib.db.fields.IntDecimalField', [], {'default': '0', 'max_digits': '38', 'decimal_places': '0'}),
48
            'usage_min': ('snf_django.lib.db.fields.IntDecimalField', [], {'default': '0', 'max_digits': '38', 'decimal_places': '0'})
49
        },
50
        'quotaholder_app.provision': {
51
            'Meta': {'object_name': 'Provision'},
52
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'db_index': 'True'}),
53
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
54
            'quantity': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
55
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
56
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'provisions'", 'to': "orm['quotaholder_app.Commission']"}),
57
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'})
58
        },
59
        'quotaholder_app.provisionlog': {
60
            'Meta': {'object_name': 'ProvisionLog'},
61
            'delta_quantity': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
62
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
63
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
64
            'issue_datetime': ('django.db.models.fields.DateTimeField', [], {}),
65
            'issue_time': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
66
            'limit': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
67
            'log_datetime': ('django.db.models.fields.DateTimeField', [], {}),
68
            'log_time': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
69
            'name': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
70
            'reason': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
71
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
72
            'serial': ('django.db.models.fields.BigIntegerField', [], {}),
73
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
74
            'usage_max': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
75
            'usage_min': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'})
76
        }
77
    }
78

  
79
    complete_apps = ['quotaholder_app']
b/snf-astakos-app/astakos/quotaholder_app/migrations/0007_auto__del_field_commission_issue_time__del_field_provisionlog_log_time.py
1
# encoding: utf-8
2
import datetime
3
from south.db import db
4
from south.v2 import SchemaMigration
5
from django.db import models
6

  
7
class Migration(SchemaMigration):
8

  
9
    def forwards(self, orm):
10
        
11
        # Deleting field 'Commission.issue_time'
12
        db.delete_column('quotaholder_app_commission', 'issue_time')
13

  
14
        # Deleting field 'ProvisionLog.log_time'
15
        db.delete_column('quotaholder_app_provisionlog', 'log_time')
16

  
17
        # Deleting field 'ProvisionLog.issue_time'
18
        db.delete_column('quotaholder_app_provisionlog', 'issue_time')
19

  
20

  
21
    def backwards(self, orm):
22
        
23
        # User chose to not deal with backwards NULL issues for 'Commission.issue_time'
24
        raise RuntimeError("Cannot reverse this migration. 'Commission.issue_time' and its values cannot be restored.")
25

  
26
        # User chose to not deal with backwards NULL issues for 'ProvisionLog.log_time'
27
        raise RuntimeError("Cannot reverse this migration. 'ProvisionLog.log_time' and its values cannot be restored.")
28

  
29
        # User chose to not deal with backwards NULL issues for 'ProvisionLog.issue_time'
30
        raise RuntimeError("Cannot reverse this migration. 'ProvisionLog.issue_time' and its values cannot be restored.")
31

  
32

  
33
    models = {
34
        'quotaholder_app.commission': {
35
            'Meta': {'object_name': 'Commission'},
36
            'clientkey': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
37
            'issue_datetime': ('django.db.models.fields.DateTimeField', [], {}),
38
            'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '4096'}),
39
            'serial': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
40
        },
41
        'quotaholder_app.holding': {
42
            'Meta': {'unique_together': "(('holder', 'source', 'resource'),)", 'object_name': 'Holding'},
43
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'db_index': 'True'}),
44
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
45
            'limit': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
46
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
47
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
48
            'usage_max': ('snf_django.lib.db.fields.IntDecimalField', [], {'default': '0', 'max_digits': '38', 'decimal_places': '0'}),
49
            'usage_min': ('snf_django.lib.db.fields.IntDecimalField', [], {'default': '0', 'max_digits': '38', 'decimal_places': '0'})
50
        },
51
        'quotaholder_app.provision': {
52
            'Meta': {'object_name': 'Provision'},
53
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'db_index': 'True'}),
54
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
55
            'quantity': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
56
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
57
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'provisions'", 'to': "orm['quotaholder_app.Commission']"}),
58
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'})
59
        },
60
        'quotaholder_app.provisionlog': {
61
            'Meta': {'object_name': 'ProvisionLog'},
62
            'delta_quantity': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
63
            'holder': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
64
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
65
            'issue_datetime': ('django.db.models.fields.DateTimeField', [], {}),
66
            'limit': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
67
            'log_datetime': ('django.db.models.fields.DateTimeField', [], {}),
68
            'name': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
69
            'reason': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
70
            'resource': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
71
            'serial': ('django.db.models.fields.BigIntegerField', [], {}),
72
            'source': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True'}),
73
            'usage_max': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'}),
74
            'usage_min': ('snf_django.lib.db.fields.IntDecimalField', [], {'max_digits': '38', 'decimal_places': '0'})
75
        }
76
    }
77

  
78
    complete_apps = ['quotaholder_app']
b/snf-astakos-app/astakos/quotaholder_app/models.py
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33 33

  
34
from datetime import datetime
35 34
from snf_django.lib.db.fields import intDecimalField
36 35

  
37
from django.db.models import (Model, BigIntegerField, CharField,
36
from django.db.models import (Model, BigIntegerField, CharField, DateTimeField,
38 37
                              ForeignKey, AutoField)
39 38
from snf_django.lib.db.managers import ForUpdateManager
40 39

  
......
55 54
        unique_together = (('holder', 'source', 'resource'),)
56 55

  
57 56

  
58
def now():
59
    return datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:24]
60

  
61

  
62 57
class Commission(Model):
63 58

  
64 59
    serial = AutoField(primary_key=True)
65 60
    name = CharField(max_length=4096, default="")
66 61
    clientkey = CharField(max_length=4096, null=False)
67
    issue_time = CharField(max_length=24)
62
    issue_datetime = DateTimeField()
68 63

  
69 64
    objects = ForUpdateManager()
70 65

  
......
97 92

  
98 93
    serial = BigIntegerField()
99 94
    name = CharField(max_length=4096)
100
    issue_time = CharField(max_length=4096)
101
    log_time = CharField(max_length=4096)
95
    issue_datetime = DateTimeField()
96
    log_datetime = DateTimeField()
102 97
    holder = CharField(max_length=4096)
103 98
    source = CharField(max_length=4096, null=True)
104 99
    resource = CharField(max_length=4096)

Also available in: Unified diff