0001-general-fix-site-import-when-link-cells-refer-to-fut.patch
combo/data/models.py | ||
---|---|---|
65 | 65 |
return len(set(page_groups).intersection(user.groups.all())) > 0 |
66 | 66 | |
67 | 67 | |
68 |
class PageManager(models.Manager): |
|
69 |
def get_by_natural_key(self, path): |
|
70 |
parts = [x for x in path.strip('/').split('/') if x] or ['index'] |
|
71 |
return self.get(slug=parts[-1]) |
|
72 | ||
73 | ||
68 | 74 |
class Page(models.Model): |
75 |
objects = PageManager() |
|
76 | ||
69 | 77 |
title = models.CharField(_('Title'), max_length=50) |
70 | 78 |
slug = models.SlugField(_('Slug')) |
71 | 79 |
template_name = models.CharField(_('Template'), max_length=50) |
... | ... | |
86 | 94 |
def __unicode__(self): |
87 | 95 |
return self.title |
88 | 96 | |
97 |
def natural_key(self): |
|
98 |
return (self.get_online_url().strip('/'), ) |
|
99 | ||
89 | 100 |
def save(self, *args, **kwargs): |
90 | 101 |
if not self.order: |
91 | 102 |
max_order = Page.objects.all().aggregate(Max('order')).get('order__max') or 0 |
... | ... | |
182 | 193 | |
183 | 194 |
def get_serialized_page(self): |
184 | 195 |
cells = CellBase.get_cells(page_id=self.id) |
185 |
serialized_page = json.loads(serializers.serialize('json', [self]))[0]
|
|
186 |
del serialized_page['pk']
|
|
196 |
serialized_page = json.loads(serializers.serialize('json', [self],
|
|
197 |
use_natural_foreign_keys=True, use_natural_primary_keys=True))[0]
|
|
187 | 198 |
del serialized_page['model'] |
188 |
del serialized_page['fields']['parent'] |
|
189 |
if self.parent_id: |
|
190 |
serialized_page['parent_slug'] = self.parent.slug |
|
191 |
serialized_page['cells'] = json.loads(serializers.serialize('json', cells)) |
|
199 |
serialized_page['cells'] = json.loads(serializers.serialize('json', |
|
200 |
cells, use_natural_foreign_keys=True, use_natural_primary_keys=True)) |
|
192 | 201 |
for cell in serialized_page['cells']: |
193 | 202 |
del cell['pk'] |
194 | 203 |
del cell['fields']['page'] |
... | ... | |
202 | 211 |
page = [x for x in serializers.deserialize('json', json.dumps([json_page]))][0] |
203 | 212 |
page.save() |
204 | 213 |
for cell in json_page.get('cells'): |
205 |
cell['fields']['page'] = page.object.id
|
|
214 |
cell['fields']['page'] = page.object.natural_key()
|
|
206 | 215 | |
207 | 216 |
# if there were cells, remove them |
208 | 217 |
for cell in CellBase.get_cells(page_id=page.object.id): |
209 | 218 |
cell.delete() |
210 | 219 | |
220 |
@classmethod |
|
221 |
def load_serialized_cells(cls, cells): |
|
211 | 222 |
# load new cells |
212 |
for cell in serializers.deserialize('json', json.dumps(json_page.get('cells'))):
|
|
223 |
for cell in serializers.deserialize('json', json.dumps(cells)):
|
|
213 | 224 |
cell.save() |
214 | 225 | |
215 | 226 |
@classmethod |
216 | 227 |
def load_serialized_pages(cls, json_site): |
228 |
cells = [] |
|
217 | 229 |
for json_page in json_site: |
218 | 230 |
cls.load_serialized_page(json_page) |
231 |
cells.extend(json_page.get('cells')) |
|
232 |
cls.load_serialized_cells(cells) |
|
219 | 233 | |
220 | 234 |
# 2nd pass to set parents |
221 | 235 |
for json_page in json_site: |
tests/test_pages.py | ||
---|---|---|
1 | 1 |
import pytest |
2 | 2 | |
3 | 3 |
from django.contrib.auth.models import User, Group |
4 |
from combo.data.models import Page |
|
4 |
from combo.data.models import Page, CellBase, TextCell, LinkCell
|
|
5 | 5 | |
6 | 6 |
pytestmark = pytest.mark.django_db |
7 | 7 | |
... | ... | |
112 | 112 |
assert not page.is_visible() |
113 | 113 |
assert page.is_visible(user1) |
114 | 114 |
assert not page.is_visible(user2) |
115 | ||
116 |
def test_import_export_pages(): |
|
117 |
page = Page(title='foo', slug='foo', order=0) |
|
118 |
page.save() |
|
119 | ||
120 |
cell = TextCell(page=page, text='foo', order=0) |
|
121 |
cell.save() |
|
122 | ||
123 |
page2 = Page(title='bar', slug='bar', order=1, parent=page) |
|
124 |
page2.save() |
|
125 | ||
126 |
cell = TextCell(page=page2, text='bar', order=0) |
|
127 |
cell.save() |
|
128 | ||
129 |
site_export = [x.get_serialized_page() for x in Page.objects.all()] |
|
130 |
Page.objects.all().delete() |
|
131 | ||
132 |
Page.load_serialized_pages(site_export) |
|
133 | ||
134 |
new_page_1 = Page.objects.all().order_by('order')[0] |
|
135 |
new_page_2 = Page.objects.all().order_by('order')[1] |
|
136 |
assert new_page_1.title == 'foo' |
|
137 |
assert new_page_2.title == 'bar' |
|
138 |
assert len(CellBase.get_cells(page_id=new_page_1.id)) == 1 |
|
139 |
assert isinstance(CellBase.get_cells(page_id=new_page_1.id)[0], TextCell) |
|
140 |
assert CellBase.get_cells(page_id=new_page_1.id)[0].text == 'foo' |
|
141 | ||
142 |
def test_import_export_pages_with_links(): |
|
143 |
page = Page(title='foo', slug='foo', order=0) |
|
144 |
page.save() |
|
145 | ||
146 |
page2 = Page(title='bar', slug='bar', order=1) |
|
147 |
page2.save() |
|
148 | ||
149 |
cell = LinkCell(page=page, title='bar', link_page=page2, order=1) |
|
150 |
cell.save() |
|
151 | ||
152 |
cell2 = LinkCell(page=page2, title='foo', link_page=page, order=1) |
|
153 |
cell2.save() |
|
154 | ||
155 |
site_export = [x.get_serialized_page() for x in Page.objects.all()] |
|
156 |
Page.objects.all().delete() |
|
157 | ||
158 |
Page.load_serialized_pages(site_export) |
|
159 | ||
160 |
new_page_1 = Page.objects.all().order_by('order')[0] |
|
161 |
new_page_2 = Page.objects.all().order_by('order')[1] |
|
162 |
assert CellBase.get_cells(page_id=new_page_1.id)[0].link_page_id == new_page_2.id |
|
163 |
assert CellBase.get_cells(page_id=new_page_2.id)[0].link_page_id == new_page_1.id |
|
115 |
- |