Projet

Général

Profil

0001-toulouse_axel-lock-unlock-locked-endpoints-38133.patch

Lauréline Guérin, 04 décembre 2019 10:56

Télécharger (5,7 ko)

Voir les différences:

Subject: [PATCH] toulouse_axel: lock/unlock/locked endpoints (#38133)

 .../migrations/0003_auto_20191203_1616.py     | 27 ++++++++++
 passerelle/contrib/toulouse_axel/models.py    | 42 ++++++++++++++++
 tests/test_toulouse_axel.py                   | 49 +++++++++++++++++++
 3 files changed, 118 insertions(+)
 create mode 100644 passerelle/contrib/toulouse_axel/migrations/0003_auto_20191203_1616.py
passerelle/contrib/toulouse_axel/migrations/0003_auto_20191203_1616.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5
import django.db.models.deletion
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('toulouse_axel', '0002_auto_20191122_0946'),
12
    ]
13

  
14
    operations = [
15
        migrations.CreateModel(
16
            name='Lock',
17
            fields=[
18
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
                ('key', models.CharField(max_length=256)),
20
                ('resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='toulouse_axel.ToulouseAxel')),
21
            ],
22
        ),
23
        migrations.AlterUniqueTogether(
24
            name='lock',
25
            unique_together=set([('resource', 'key')]),
26
        ),
27
    ]
passerelle/contrib/toulouse_axel/models.py
133 133
    LINK_SCHEMA['properties'].pop('IDPERSONNE')
134 134
    LINK_SCHEMA['required'].remove('IDPERSONNE')
135 135

  
136
    @endpoint(
137
        description=_('Lock a resource'),
138
        perm='can_access',
139
        parameters={
140
            'key': {'description': _('Key of the resource to lock')},
141
        })
142
    def lock(self, request, key):
143
        lock, created = Lock.objects.get_or_create(resource=self, key=key)
144
        return {'key': key, 'locked': True}
145

  
146
    @endpoint(
147
        description=_('Unlock a resource'),
148
        perm='can_access',
149
        parameters={
150
            'key': {'description': _('Key of the resource to unlock')},
151
        })
152
    def unlock(self, request, key):
153
        Lock.objects.filter(resource=self, key=key).delete()
154
        return {'key': key, 'locked': False}
155

  
156
    @endpoint(
157
        description=_('Get the lock status of a resource'),
158
        perm='can_access',
159
        parameters={
160
            'key': {'description': _('Key of the resource')},
161
        })
162
    def locked(self, request, key):
163
        try:
164
            Lock.objects.get(resource=self, key=key)
165
            locked = True
166
        except Lock.DoesNotExist:
167
            locked = False
168
        return {'key': key, 'locked': locked}
169

  
136 170
    @endpoint(
137 171
        description=_('Create link between user and Toulouse Axel'),
138 172
        perm='can_access',
......
197 231

  
198 232
    class Meta:
199 233
        unique_together = ('resource', 'name_id')
234

  
235

  
236
class Lock(models.Model):
237
    resource = models.ForeignKey(ToulouseAxel, on_delete=models.CASCADE)
238
    key = models.CharField(max_length=256)
239

  
240
    class Meta:
241
        unique_together = ('resource', 'key')
tests/test_toulouse_axel.py
23 23
from passerelle.contrib.toulouse_axel.models import (
24 24
    AxelError,
25 25
    Link,
26
    Lock,
26 27
    ToulouseAxel,
27 28
    ref_famille_dui,
28 29
    ref_verif_dui,
......
48 49
    }
49 50

  
50 51

  
52
def test_lock(app, resource):
53
    assert Lock.objects.count() == 0
54
    resp = app.get('/toulouse-axel/test/lock?key=foobar')
55
    assert resp.json['err'] == 0
56
    assert resp.json['key'] == 'foobar'
57
    assert resp.json['locked'] is True
58
    lock = Lock.objects.latest('pk')
59
    assert lock.resource == resource
60
    assert lock.key == 'foobar'
61

  
62
    # again
63
    resp = app.get('/toulouse-axel/test/lock?key=foobar')
64
    assert resp.json['err'] == 0
65
    assert resp.json['key'] == 'foobar'
66
    assert resp.json['locked'] is True
67
    assert Lock.objects.count() == 1
68

  
69

  
70
def test_unlock(app, resource):
71
    Lock.objects.create(resource=resource, key='foobar')
72
    resp = app.get('/toulouse-axel/test/unlock?key=foobar')
73
    assert resp.json['err'] == 0
74
    assert resp.json['key'] == 'foobar'
75
    assert resp.json['locked'] is False
76
    assert Lock.objects.count() == 0
77

  
78
    # again
79
    resp = app.get('/toulouse-axel/test/unlock?key=foobar')
80
    assert resp.json['err'] == 0
81
    assert resp.json['key'] == 'foobar'
82
    assert resp.json['locked'] is False
83
    assert Lock.objects.count() == 0
84

  
85

  
86
def test_locked(app, resource):
87
    assert Lock.objects.count() == 0
88
    resp = app.get('/toulouse-axel/test/locked?key=foobar')
89
    assert resp.json['err'] == 0
90
    assert resp.json['key'] == 'foobar'
91
    assert resp.json['locked'] is False
92

  
93
    Lock.objects.create(resource=resource, key='foobar')
94
    resp = app.get('/toulouse-axel/test/locked?key=foobar')
95
    assert resp.json['err'] == 0
96
    assert resp.json['key'] == 'foobar'
97
    assert resp.json['locked'] is True
98

  
99

  
51 100
def test_operation_status_error(resource):
52 101
    resp = '''
53 102
    <?xml version="1.0"?>
54
-