Skip to content
This repository has been archived by the owner on Aug 4, 2021. It is now read-only.

Commit

Permalink
WIP: migrate page meta data
Browse files Browse the repository at this point in the history
  • Loading branch information
jedie committed Jul 19, 2015
1 parent 94d9a9e commit 20fe8d3
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 12 deletions.
15 changes: 15 additions & 0 deletions pylucid_debug/admin.py
Expand Up @@ -21,6 +21,7 @@
from cms.models import Page, Placeholder, CMSPlugin, Title

from reversion_compare.helpers import patch_admin
from pylucid_migration.models import PageProxyModel

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -81,6 +82,20 @@ class TitleAdmin(admin.ModelAdmin):
admin.site.register(Title, TitleAdmin)


class PageLowLevelAdmin(admin.ModelAdmin):
def url(self, obj):
return obj.get_absolute_url()

def title(self, obj):
return obj

list_display = ("url", "title", "publisher_is_draft", "created_by", "creation_date", "changed_by", "changed_date", "template", "site")
list_display_links = ("url", "title")
list_filter = ("publisher_is_draft", "created_by", "changed_by")

admin.site.register(PageProxyModel, PageLowLevelAdmin)


auto_register_all()

auto_patch_all()
57 changes: 45 additions & 12 deletions pylucid_migration/management/commands/migrate_pylucid.py
Expand Up @@ -25,21 +25,42 @@
from django.contrib.auth.models import User

import cms
from cms.api import create_page, create_title, get_page_draft
from cms.api import create_page, create_title, get_page_draft, publish_page
from cms.models import Placeholder
from cms.models.permissionmodels import PagePermission, ACCESS_PAGE_AND_DESCENDANTS

from pylucid_migration.management.migrate_base import MigrateBaseCommand, StatusLine
from pylucid_migration.models import PageTree, PageMeta, PageContent
from pylucid_migration.models import PageTree, PageMeta, PageContent, PageProxyModel, PagePatchModel
from pylucid_migration.split_content import content2plugins


class PageMetaPatcher(object):
def __init__(self, created_by, creation_date, changed_by, changed_date):
self.created_by = created_by
self.creation_date = creation_date
self.changed_by = changed_by
self.changed_date = changed_date

def patch(self, page):
# print("Patch ID: %i - %s" % (page.pk, page))
patch_page = PagePatchModel.objects.get(pk=page.pk)
patch_page.created_by = self.created_by
patch_page.creation_date = self.creation_date
patch_page.changed_by = self.changed_by
patch_page.changed_date = self.changed_date
patch_page.save()
# print(patch_page.created_by, patch_page.creation_date, patch_page.changed_by, patch_page.changed_date)


class Command(MigrateBaseCommand):
help = 'Migrate PyLucid v1 to v2'

_PAGES={}
_PAGES = {}

def _migrate_page(self, options, site, pagetree, pagemeta, pagecontent):
url = pagemeta.get_absolute_url()
created_py = self.USER_MAP[pagemeta.createby.pk]
changed_by = self.USER_MAP[pagemeta.lastupdateby.pk]

if pagemeta.permitViewGroup == None and pagetree.permitViewGroup == None:
login_required = False
Expand Down Expand Up @@ -68,9 +89,6 @@ def _migrate_page(self, options, site, pagetree, pagemeta, pagecontent):
else:
parent = None

old_user = pagemeta.createby
created_py = self.USER_MAP[old_user.pk]

# http://docs.django-cms.org/en/support-3.0.x/reference/api_references.html#cms.api.create_page
page = create_page(
title=pagemeta.get_title(),
Expand Down Expand Up @@ -161,12 +179,27 @@ def _migrate_page(self, options, site, pagetree, pagemeta, pagecontent):
)
page_permission.save()

page = get_page_draft(page)

content2plugins(options, placeholder, pagecontent.content, pagecontent.markup,
pagemeta.language.code)

page.publish(pagemeta.language.code)
page_meta_patcher = PageMetaPatcher(
created_by=created_py.username,
creation_date=pagemeta.createtime,
changed_by=changed_by.username,
changed_date=pagemeta.lastupdatetime,
)

draft_page = get_page_draft(page)

published_page = publish_page(draft_page, user=changed_by, language=pagemeta.language.code)
published_page = published_page.get_public_object()
published_page.save()

# print("\npatch draft version")
page_meta_patcher.patch(draft_page) # patch the draft version
# print("patch the published version")
page_meta_patcher.patch(published_page) # patch the published version
# print("patch done.")

def _migrate_pagetree(self, options, count, tree, user, site):
print("\nMigrate pages from site %s" % site.name)
Expand All @@ -187,6 +220,9 @@ def _migrate_pagetree(self, options, count, tree, user, site):

self._migrate_page(options, site, pagetree, pagemeta, pagecontent)

# if no>8:
# break

def _migrate_pylucid(self, options):
user = User.objects.all().filter(is_superuser=True)[0]

Expand All @@ -204,6 +240,3 @@ def handle(self, *args, **options):
self._migrate_pylucid(options)
except Exception:
traceback.print_exc(file=self.stderr)



1 change: 1 addition & 0 deletions pylucid_migration/models/__init__.py
Expand Up @@ -22,3 +22,4 @@
from pylucid_migration.models.userprofile import UserProfile
from pylucid_migration.models.dbtemplates import DBTemplate
from pylucid_migration.models.blog import BlogEntryContent
from pylucid_migration.models.cms_pagemodel import PageProxyModel, PagePatchModel
48 changes: 48 additions & 0 deletions pylucid_migration/models/cms_pagemodel.py
@@ -0,0 +1,48 @@

from django.utils.translation import ugettext_lazy as _
from django.db import models
from django.db.models.base import Model

from cms.models import Page


class PageProxyModel(Page):
"""
Used to add a "normal" django admin model page
"""
def save(self):
# print("mro:", PageProxyModel.__mro__)
"""
<class 'pylucid_migration.models.cms_pagemodel.PageProxyModel'>
<class 'cms.models.pagemodel.Page'>
<class 'mptt.models.MPTTModel'>
<class 'django.db.models.base.Model'>
<class 'object'>
"""
Model.save(self)

class Meta:
proxy = True
app_label="cms" # Important for db LegacyRouter()
verbose_name = _('page (proxy model)')
verbose_name_plural = _('pages (proxy model)')




class PagePatchModel(models.Model):
"""
Used to change data in cms.Page model.
Using the origin model will not easily work, because:
* created_by & changed_by will set in Page.save() from _thread_locals.users
* creation_date & changed_date used auto_now / auto_now_add and can't be temporary disabled :(
"""
created_by = models.CharField(max_length=70)
changed_by = models.CharField(max_length=70)
creation_date = models.DateTimeField()
changed_date = models.DateTimeField()

class Meta:
app_label="cms" # Important for db LegacyRouter()
db_table = "cms_page" # XXX: How to get this from origin model ?!?

0 comments on commit 20fe8d3

Please sign in to comment.