0001-lingo-add-backends-and-regies-in-site-import-export-.patch
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 |
- |