예제 #1
0
파일: template.py 프로젝트: ra2003/mercury
def template_set_default(template_id):
    '''
    UI for setting a given template as the default for an archive type
    '''

    user = auth.is_logged_in(request)
    tpl = Template.load(template_id)
    blog = Blog.load(tpl.blog.id)
    permission = auth.is_blog_designer(user, blog)

    auth.check_template_lock(blog)

    tags = template_tags(template=tpl, user=user)

    from core.utils import Status
    import settings

    if request.forms.getunicode('confirm') == user.logout_nonce:

        # check for form submission
        # setting should be done by way of class object
        # theme? blog? template?
        # blog.set_default_archive_template(template,{archive_type.index...})

        status = Status(
            type='success',
            close=False,
            message=
            'Template <b>{}</b> was successfully refreshed from theme <b>{}</b>.'
            .format(tpl.for_display, tpl.theme.for_display),
            action='Return to template',
            url='{}/template/{}/edit'.format(settings.BASE_URL, tpl.id))
        tags.status = status
    else:
        pass

    from core.models import archive_defaults

    return template('edit/template-set-default',
                    icons=icons,
                    search_context=(search_contexts['blog'], tags.blog),
                    menu=generate_menu('blog_edit_template', tags.template),
                    sidebar=sidebar.render_sidebar(
                        panel_set='edit_template',
                        publishing_mode=publishing_mode,
                        types=template_type,
                        **tags.__dict__),
                    archive_defaults=archive_defaults,
                    **tags.__dict__)
예제 #2
0
파일: template.py 프로젝트: ra2003/mercury
def template_delete(template_id):
    '''
    UI for deleting a template
    '''
    user = auth.is_logged_in(request)
    tpl = Template.load(template_id)
    blog = Blog.load(tpl.blog)
    permission = auth.is_blog_designer(user, blog)

    from core.utils import Status
    import settings

    tags = template_tags(template_id=tpl.id, user=user)

    if request.forms.getunicode('confirm') == user.logout_nonce:

        # _template.delete(tpl)
        tpl.delete_instance()

        status = Status(type='success',
                        close=False,
                        message='Template {} was successfully deleted.'.format(
                            tpl.for_log),
                        action='Return to template list',
                        url='{}/blog/{}/templates'.format(
                            settings.BASE_URL, blog.id))

    else:

        status = Status(
            type='warning',
            close=False,
            message=
            'You are attempting to delete template <b>{}</b> from blog <b>{}</b>.'
            .format(tpl.for_display, blog.for_display),
            no={
                'url': '{}/template/{}/edit'.format(settings.BASE_URL, tpl.id),
                'label': 'No, I don\'t want to delete this template'
            },
            yes={
                'id': 'delete',
                'name': 'confirm',
                'label': 'Yes, I want to delete this template',
                'value': user.logout_nonce
            })

    tags.status = status

    return report(tags, 'blog_delete_template', tpl)
예제 #3
0
파일: routes.py 프로젝트: syegulalp/mercury
def queue_archive_template_fast(template_id, action, pass_id=0):
    from core.models import Template, Queue
    template = Template.load(template_id)
    blog = template.blog

    from core import cms
    from core.libs.bottle import HTTPResponse
    r = HTTPResponse()

    fileinfos = FileInfo.select().where(FileInfo.template_mapping << template.mappings).paginate(pass_id, 50)

    # TODO: if action is fast and no fileinfos present, redirect to full rebuild?

    if fileinfos.count() > 0:

        r.body = "Adding {}".format(pass_id * 50)

        for f in fileinfos:
            Queue.push(job_type=cms.queue.job_type.archive,
                    blog=blog,
                    site=blog.site,
                    data_integer=f.id)

        pass_id += 1

        r.add_header('Refresh', "0;{}/template/{}/{}/fast/{}".format(
            BASE_PATH,
            template_id,
            action,
            pass_id))

    else:
        r.body = "Queue insertion finished."
        if action == 'publish':
            redir = 'publish'
        else:
            redir = 'queue'
        r.add_header('Refresh', "0;{}/blog/{}/{}".format(
            BASE_PATH,
            blog.id,
            redir))

    return r
예제 #4
0
파일: routes.py 프로젝트: syegulalp/mercury
def queue_archive_template_all(template_id, action, pass_id=0):
    from core.models import Template, Queue
    template = Template.load(template_id)
    blog = template.blog

    from core.cms import fileinfo, queue
    from core.libs.bottle import HTTPResponse
    r = HTTPResponse()

    pages = blog.pages.published.paginate(pass_id, 50)

    if pages.count() > 0:

        r.body = "Adding {}".format(pass_id * 50)

        for f in fileinfo.build_archives_fileinfos_by_mappings(template, pages):
            Queue.push(job_type=queue.job_type.archive,
                    blog=blog,
                    site=blog.site,
                    data_integer=f.id)

        pass_id += 1

        r.add_header('Refresh', "0;{}/template/{}/{}/all/{}".format(
            BASE_PATH,
            template_id,
            action,
            pass_id))

    else:
        r.body = "Queue insertion finished."
        if action == 'publish':
            redir = 'publish'
        else:
            redir = 'queue'
        r.add_header('Refresh', "0;{}/blog/{}/{}".format(
            BASE_PATH,
            blog.id,
            redir))

    return r
예제 #5
0
파일: routes.py 프로젝트: ra2003/mercury
def queue_archive_template_fast(template_id, action, pass_id=0):
    from core.models import Template, Queue
    template = Template.load(template_id)
    blog = template.blog

    from core import cms
    from core.libs.bottle import HTTPResponse
    r = HTTPResponse()

    fileinfos = FileInfo.select().where(
        FileInfo.template_mapping << template.mappings).paginate(pass_id, 50)

    # TODO: if action is fast and no fileinfos present, redirect to full rebuild?

    if fileinfos.count() > 0:

        r.body = "Adding {}".format(pass_id * 50)

        for f in fileinfos:
            Queue.push(job_type=cms.queue.job_type.archive,
                       blog=blog,
                       site=blog.site,
                       data_integer=f.id)

        pass_id += 1

        r.add_header(
            'Refresh',
            "0;{}/template/{}/{}/fast/{}".format(BASE_PATH, template_id,
                                                 action, pass_id))

    else:
        r.body = "Queue insertion finished."
        if action == 'publish':
            redir = 'publish'
        else:
            redir = 'queue'
        r.add_header('Refresh',
                     "0;{}/blog/{}/{}".format(BASE_PATH, blog.id, redir))

    return r
예제 #6
0
파일: template.py 프로젝트: ra2003/mercury
def template_edit(template_id):
    '''
    UI for editing a blog template
    '''

    user = auth.is_logged_in(request)
    edit_template = Template.load(template_id)
    blog = Blog.load(edit_template.blog.id)
    permission = auth.is_blog_designer(user, blog)

    auth.check_template_lock(blog)

    utils.disable_protection()

    tags = template_tags(template_id=template_id, user=user)

    # find out if the template object returns a list of all the mappings, or just the first one
    # it's edit_template.mappings

    tags.mappings = template_mapping_index[edit_template.template_type]

    return template_edit_output(tags)
예제 #7
0
파일: routes.py 프로젝트: ra2003/mercury
def queue_archive_template_all(template_id, action, pass_id=0):
    from core.models import Template, Queue
    template = Template.load(template_id)
    blog = template.blog

    from core.cms import fileinfo, queue
    from core.libs.bottle import HTTPResponse
    r = HTTPResponse()

    pages = blog.pages.published.paginate(pass_id, 50)

    if pages.count() > 0:

        r.body = "Adding {}".format(pass_id * 50)

        for f in fileinfo.build_archives_fileinfos_by_mappings(
                template, pages):
            Queue.push(job_type=queue.job_type.archive,
                       blog=blog,
                       site=blog.site,
                       data_integer=f.id)

        pass_id += 1

        r.add_header(
            'Refresh',
            "0;{}/template/{}/{}/all/{}".format(BASE_PATH, template_id, action,
                                                pass_id))

    else:
        r.body = "Queue insertion finished."
        if action == 'publish':
            redir = 'publish'
        else:
            redir = 'queue'
        r.add_header('Refresh',
                     "0;{}/blog/{}/{}".format(BASE_PATH, blog.id, redir))

    return r
예제 #8
0
파일: template.py 프로젝트: ra2003/mercury
def template_preview_core(template_id):
    '''
    UI for generating a preview of a given template
    '''
    from core.models import Page, FileInfo, page_status
    from core.cms import fileinfo
    from core.cms import invalidate_cache

    invalidate_cache()

    template = Template.load(template_id)

    # TODO: only rebuild mappings if the dirty bit is set

    if template.template_type == template_type.index:

        fi = template.default_mapping.fileinfos
        test_preview_mapping(fi.count(), template)
        fi = fi.get()
        tags = template_tags(blog=template.blog,
                             template=template,
                             fileinfo=fi)

    elif template.template_type == template_type.page:
        try:
            fi = Page.load(int(request.query['use_page'])).fileinfos[0]
        except (KeyError, TypeError):
            fi = template.fileinfos
            test_preview_mapping(fi.count(), template)
            fi = fi.select().join(Page).where(
                FileInfo.page == Page.id,
                Page.blog == template.blog,
                Page.status == page_status.published,
            ).order_by(Page.publication_date.desc()).get()
        tags = template_tags(
            template=template,
            page=fi.page,
        )

    elif template.template_type == template_type.include:
        if template.publishing_mode != publishing_mode.ssi:
            from core.error import PreviewException
            raise PreviewException(
                'You can only preview server-side includes.')
        page = template.blog.pages.published.order_by(
            Page.publication_date.desc()).get()
        fi = page.fileinfos[0]
        tags = template_tags(
            template=template,
            page=page,
        )

    elif template.template_type == template_type.archive:

        if 'use_page' in request.query:
            page_list = [Page.load(int(request.query['use_page']))]
        elif 'use_category' in request.query:
            from core.models import Category
            page_list = Category.load(int(
                request.query['use_category'])).pages.published.limit(1)
        elif 'use_tag' in request.query:
            from core.models import Tag
            page_list = Tag.load(int(
                request.query['use_tag'])).pages.published.limit(1)
        else:
            page_list = template.blog.pages.published.limit(1)

        fi = fileinfo.build_archives_fileinfos_by_mappings(template,
                                                           pages=page_list)
        test_preview_mapping(len(fi), template)
        fi = fi[0]

        archive_pages = fileinfo.generate_archive_context_from_fileinfo(
            fi.xref.archive_xref, template.blog.pages.published, fi)

        tags = template_tags(blog=template.blog,
                             archive=archive_pages,
                             archive_context=fi,
                             fileinfo=fi,
                             template=template)

    elif template.template_type in (template_type.media, template_type.system):
        from core.error import PreviewException
        raise PreviewException(
            'Template {} is of a type that cannot yet be previewed.'.format(
                template.for_log))

    import time
    from core.template import tplt
    tc = time.clock
    start = tc()
    tpl_output = tplt(template, tags)
    end = tc()

    tpl_output = r'<!-- Produced by template {}. Total render time:{} secs -->{}'.format(
        template.for_log, end - start, tpl_output)

    preview_file_path, preview_url = fi.make_preview()

    from core.cms import queue
    queue.write_file(tpl_output, template.blog.path, preview_file_path)

    return ("{}?_={}".format(preview_url, template.modified_date.microsecond))
예제 #9
0
파일: template.py 프로젝트: ra2003/mercury
def template_edit_save(template_id):
    '''
    UI for saving a blog template
    '''
    user = auth.is_logged_in(request)
    tpl = Template.load(template_id)
    blog = Blog.load(tpl.blog)
    permission = auth.is_blog_designer(user, blog)

    auth.check_template_lock(blog)

    from core.utils import Status
    from core.error import TemplateSaveException, PageNotChanged

    status = None

    save_mode = int(request.forms.getunicode('save', default="0"))

    if save_mode in (1, 2, 3):
        try:
            message = template_save(request, user, tpl, blog)
        except TemplateSaveException as e:
            status = Status(type='danger',
                            no_sure=True,
                            message="Error saving template <b>{}</b>:".format(
                                tpl.for_display),
                            message_list=(e, ))
        except PageNotChanged as e:
            status = Status(type='success',
                            message="Template <b>{}</b> was unchanged.".format(
                                tpl.for_display))

        except Exception as e:
            raise e
            status = Status(
                type='warning',
                no_sure=True,
                message="Problem saving template <b>{}</b>: <br>".format(
                    tpl.for_display),
                message_list=(e, ))

        else:
            tpl.delete_preview()
            status = Status(
                type='success',
                message="Template <b>{}</b> saved successfully. {}".format(
                    tpl.for_display,
                    message)  # TODO: move messages into message lister
            )

    tags = template_tags(template_id=template_id, user=user)

    tags.mappings = template_mapping_index[tpl.template_type]

    tags.status = status

    from core.models import (template_type as template_types)

    return template('edit/template_ajax',
                    sidebar=sidebar.render_sidebar(
                        panel_set='edit_template',
                        publishing_mode=publishing_mode,
                        types=template_types,
                        **tags.__dict__),
                    **tags.__dict__)
예제 #10
0
파일: template.py 프로젝트: ra2003/mercury
def template_refresh(template_id):
    '''
    UI for reloading a template from the original version stored in the
    template's theme (assuming such an original template exists)
    '''
    user = auth.is_logged_in(request)
    tpl = Template.load(template_id)
    blog = Blog.load(tpl.blog)
    permission = auth.is_blog_designer(user, blog)

    from core.utils import Status
    import settings

    tags = template_tags(template_id=tpl.id, user=user)

    if request.forms.getunicode('confirm') == user.logout_nonce:

        import os, json
        template_path = (os.path.join(tpl.theme.path, tpl.template_ref))

        with open(template_path, 'r') as f:
            tp_json = json.loads(f.read())
            # TODO: We will eventually merge in all the other refresh functions
            # and convert this to a generic function called from
            # mgmt.theme_apply_to_blog as well
            with open(template_path[:-5] + '.tpl', 'r') as b:
                tpl.body = b.read()
            tpl.save(user)

        status = Status(
            type='success',
            close=False,
            message=
            'Template <b>{}</b> was successfully refreshed from theme <b>{}</b>.'
            .format(tpl.for_display, tpl.theme.for_display),
            action='Return to template',
            url='{}/template/{}/edit'.format(settings.BASE_URL, tpl.id))

    else:

        status = Status(type='warning',
                        close=False,
                        message='''
You are attempting to refresh template <b>{}</b> for blog <b>{}</b> from its underlying theme <b>{}</b>.</p>
<p>This will <b>overwrite</b> the current version of the template and replace it with the original version
from the theme.
'''.format(tpl.for_display, blog.for_display, tpl.theme.for_display),
                        no={
                            'url':
                            '{}/template/{}/edit'.format(
                                settings.BASE_URL, tpl.id),
                            'label':
                            'No, I don\'t want to replace this template'
                        },
                        yes={
                            'id': 'delete',
                            'name': 'confirm',
                            'label': 'Yes, I want to replace this template',
                            'value': user.logout_nonce
                        })

    tags.status = status

    return report(tags, 'blog_delete_template', tpl)