Projet

Général

Profil

0001-lingo-add-backends-and-regies-in-site-import-export-.patch

Valentin Deniaud, 03 novembre 2020 17:08

Télécharger (8,17 ko)

Voir les différences:

Subject: [PATCH 1/2] lingo: add backends and regies in site import/export
 (#46895)

 combo/apps/lingo/models.py  | 68 +++++++++++++++++++++++++++++++++++++
 combo/data/utils.py         | 10 ++++++
 tests/test_import_export.py | 36 ++++++++++++++++++++
 3 files changed, 114 insertions(+)
combo/apps/lingo/models.py
29 29

  
30 30
from django import template
31 31
from django.conf import settings
32
from django.core import serializers
32 33
from django.db import models
33 34
from django.forms import models as model_forms, Select
34 35
from django.utils.translation import ugettext_lazy as _
......
93 94
                      reference_id=data.get('reference_id'))
94 95

  
95 96

  
97
class PaymentBackendManager(models.Manager):
98
    def get_by_natural_key(self, slug):
99
        return self.get(slug=slug)
100

  
101

  
96 102
@python_2_unicode_compatible
97 103
class PaymentBackend(models.Model):
98 104
    label = models.CharField(verbose_name=_('Label'), max_length=64)
......
103 109
        verbose_name=_('Payment Service'), max_length=64, choices=SERVICES)
104 110
    service_options = JSONField(blank=True, verbose_name=_('Payment Service Options'))
105 111

  
112
    objects = PaymentBackendManager()
113

  
106 114
    def __str__(self):
107 115
        return self.label
108 116

  
......
119 127
            options = {}
120 128
        return eopayment.Payment(self.service, options)
121 129

  
130
    def natural_key(self):
131
        return (self.slug,)
132

  
133
    @classmethod
134
    def export_all_for_json(cls):
135
        return [x.get_as_serialized_object() for x in cls.objects.all()]
136

  
137
    def get_as_serialized_object(self):
138
        serialized_backend = json.loads(
139
            serializers.serialize('json', [self], use_natural_primary_keys=True)
140
        )[0]
141
        del serialized_backend['model']
142
        return serialized_backend
143

  
144
    @classmethod
145
    def load_serialized_objects(cls, json_site):
146
        for json_backend in json_site:
147
            cls.load_serialized_object(json_backend)
148

  
149
    @classmethod
150
    def load_serialized_object(cls, json_backend):
151
        json_backend['model'] = str(cls._meta)
152
        try:
153
            backend = cls.objects.get_by_natural_key(json_backend['fields']['slug'])
154
            json_backend['pk'] = backend.pk
155
        except cls.DoesNotExist:
156
            pass
157

  
158
        backend = next(serializers.deserialize('json', json.dumps([json_backend]), ignorenonexistent=True))
159
        backend.save()
160

  
122 161

  
123 162
class RegieException(Exception):
124 163
    pass
......
373 412
            message.attach('%s.pdf' % invoice.id, invoice_pdf.content, 'application/pdf')
374 413
        message.send()
375 414

  
415
    @classmethod
416
    def export_all_for_json(cls):
417
        return [x.get_as_serialized_object() for x in cls.objects.all()]
418

  
419
    def get_as_serialized_object(self):
420
        serialized_regie = serializers.serialize(
421
            'json', [self], use_natural_primary_keys=True, use_natural_foreign_keys=True
422
        )
423
        serialized_regie = json.loads(serialized_regie)[0]
424
        del serialized_regie['model']
425
        return serialized_regie
426

  
427
    @classmethod
428
    def load_serialized_objects(cls, json_site):
429
        for json_regie in json_site:
430
            cls.load_serialized_object(json_regie)
431

  
432
    @classmethod
433
    def load_serialized_object(cls, json_regie):
434
        json_regie['model'] = str(cls._meta)
435
        try:
436
            regie = cls.objects.get(slug=json_regie['fields']['slug'])
437
            json_regie['pk'] = regie.pk
438
        except cls.DoesNotExist:
439
            pass
440

  
441
        regie = next(serializers.deserialize('json', json.dumps([json_regie]), ignorenonexistent=True))
442
        regie.save()
443

  
376 444

  
377 445
class BasketItem(models.Model):
378 446
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
combo/data/utils.py
31 31
from combo.apps.assets.utils import tar_assets_files
32 32
from combo.apps.maps.models import MapLayer
33 33
from combo.apps.pwa.models import PwaSettings, PwaNavigationEntry
34
from combo.apps.lingo.models import PaymentBackend, Regie
34 35
from .models import Page
35 36

  
36 37

  
......
54 55
            'pwa': {
55 56
                'settings': PwaSettings.export_for_json(),
56 57
                'navigation': PwaNavigationEntry.export_all_for_json(),
58
            },
59
            'payment': {
60
                'backends': PaymentBackend.export_all_for_json(),
61
                'regies': Regie.export_all_for_json(),
57 62
            }
58 63
           }
59 64

  
......
88 93
            Page.objects.all().delete()
89 94
            PwaSettings.objects.all().delete()
90 95
            PwaNavigationEntry.objects.all().delete()
96
            PaymentBackend.objects.all().delete()
97
            Regie.objects.all().delete()
91 98

  
92 99
        try:
93 100
            MapLayer.load_serialized_objects(data.get('map-layers') or [])
......
97 104
            if data.get('pwa'):
98 105
                PwaSettings.load_serialized_settings(data['pwa'].get('settings'))
99 106
                PwaNavigationEntry.load_serialized_objects(data['pwa'].get('navigation'))
107
            if data.get('payment'):
108
                PaymentBackend.load_serialized_objects(data['payment'].get('backends'))
109
                Regie.load_serialized_objects(data['payment'].get('regies'))
100 110
        except DeserializationError as e:
101 111
            message = str(e)
102 112
            if not message.startswith('Page matching query does not exist.'):
tests/test_import_export.py
19 19
from combo.apps.assets.models import Asset
20 20
from combo.apps.assets.utils import clean_assets_files
21 21
from combo.apps.gallery.models import Image, GalleryCell
22
from combo.apps.lingo.models import PaymentBackend, Regie
22 23
from combo.apps.maps.models import MapLayer, Map, MapLayerOptions
23 24
from combo.apps.pwa.models import PwaSettings, PwaNavigationEntry
24 25
from combo.data.models import Page, TextCell
......
421 422
    tarfile.open(filename, 'w').close()  # empty tar file
422 423
    with pytest.raises(CommandError, match=r'TAR file should provide _site.json file'):
423 424
        call_command('import_site', filename)
425

  
426

  
427
def test_import_export_payment(app):
428
    backend = PaymentBackend.objects.create(label='Test', slug='test', service_options={'test': True})
429
    Regie.objects.create(label='Test regie', slug='test-regie', payment_backend=backend)
430
    Regie.objects.create(label='Test regie 2', slug='test-regie-2', payment_backend=backend)
431

  
432
    output = get_output_of_command('export_site')
433
    payload = json.loads(output)
434
    assert len(payload['payment']['backends']) == 1
435
    assert len(payload['payment']['regies']) == 2
436

  
437
    import_site(payload)
438
    assert PaymentBackend.objects.count() == 1
439
    assert Regie.objects.count() == 2
440

  
441
    PaymentBackend.objects.all().delete()
442
    Regie.objects.all().delete()
443
    import_site(payload)
444

  
445
    backend =  PaymentBackend.objects.get(slug='test')
446
    assert backend.label == 'Test'
447
    assert backend.service_options == {'test': True}
448

  
449
    assert Regie.objects.count() == 2
450
    regie = Regie.objects.first()
451
    assert regie.payment_backend == backend
452

  
453
    import_site(data={}, clean=True)
454
    assert PaymentBackend.objects.count() == 0
455
    assert Regie.objects.count() == 0
456

  
457
    empty_output = get_output_of_command('export_site')
458
    assert len(json.loads(empty_output)['payment']['backends']) == 0
459
    assert len(json.loads(empty_output)['payment']['regies']) == 0
424
-