Projet

Général

Profil

0001-general-fix-site-import-when-link-cells-refer-to-fut.patch

Frédéric Péters, 06 mars 2016 16:02

Télécharger (5,64 ko)

Voir les différences:

Subject: [PATCH] general: fix site import when link cells refer to future
 cells (#8598)

 combo/data/models.py | 30 ++++++++++++++++++++++--------
 tests/test_pages.py  | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 72 insertions(+), 9 deletions(-)
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
-