pax_global_header00006660000000000000000000000064121225554340014515gustar00rootroot0000000000000052 comment=a2410544685820dda6b0fdde9db6860b0e750264 feincms-1.7.4/000077500000000000000000000000001212255543400131525ustar00rootroot00000000000000feincms-1.7.4/.gitignore000066400000000000000000000001741212255543400151440ustar00rootroot00000000000000*.pyc *~ .*.swp \#*# /secrets.py .DS_Store ._* /FeinCMS.egg-info /MANIFEST /_build /build /dist tests/test.zip /docs/_build feincms-1.7.4/.mailmap000066400000000000000000000007511212255543400145760ustar00rootroot00000000000000Daniel Renz Daniel Renz Simon Schürpf Simon Schürpf Martin J. Laubach Martin J. Laubach Maarten van Gompel (proycon) Bojan Mihelac Antoni Aloy Nico Echaniz Bjorn Post Skylar Saveland Stephan Jaekel feincms-1.7.4/AUTHORS000066400000000000000000000020751212255543400142260ustar00rootroot00000000000000The authors of FeinCMS are: * Matthias Kestenholz * Martin J. Laubach * Chris Adams * Simon Meers * Bojan Mihelac * Bjorn Post * Stephan Jaekel * Julien Phalip * Daniel Renz * Matt Dawson * Simon Schürpf * Skylar Saveland * Simon Bächler * Stefan Reinhard * Bjarni Thorisson * Greg Taylor * Maarten van Gompel (proycon) * Psyton * Simon Schmid * Antoni Aloy * Marc Egli * Urs Breton * Jonas * Martin Mahner * Max Peterson * Nico Echaniz * Toby White * Vítor Figueiró * Andrew D. Ball * Brian Macdonald * Eric Delord * Gabriel Kovacs * Torkn * Fabian Vogler * Håvard Grimelid * Maciek Szczesniak * Marco Fucci * Maarten Draijer * Michael Bashkirov * Mikhail Korobov * Wil Tan * tayg * Alen Mujezinovic * Alex Kamedov * Andi Albrecht * Anshuman Bhaduri * Darryl Woods * Denis Martinez * Domas Lapinskas * Fabian Germann * George Karpenkov * Harro van der Klauw * Jay Yu * Livio Lunin * Marc Tamlyn * Mark Renton * Mason Hugus * Mikkel Hoegh * Olekasnadr Gula * Paul Garner * Rico Moorman * Sebastian Hillig * Silvan Spross * Tobias Haffner * Vaclav Klecanda * Wouter van der Graaf feincms-1.7.4/LICENSE000066400000000000000000000030251212255543400141570ustar00rootroot00000000000000Copyright (c) 2009-2011, FEINHEIT GmbH and individual contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of FEINHEIT GmbH nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. feincms-1.7.4/MANIFEST.in000066400000000000000000000003401212255543400147050ustar00rootroot00000000000000include AUTHORS include LICENSE include MANIFEST.in include README.rst include requirements.txt include setuplib.py recursive-include feincms/static * recursive-include feincms/locale * recursive-include feincms/templates * feincms-1.7.4/QUICKSTART.rst000066400000000000000000000037221212255543400154020ustar00rootroot00000000000000======================================== Setup FeinCMS in less than five minutes ======================================== Quickstart =============== Clone FeinCMS from github (https://github.com/feincms/feincms) into your desired development directory: :: $ git clone git://github.com/feincms/feincms.git Now you find a directory named 'feincms' in your development directory. This is your project directory. Feel free to change its name: :: $ mv feincms/ myFeinCMSSite Now you can choose between the quickstart variant which takes about a minute (depending on your network connection) or the manual setup, which is as easy as the quickstart variant, but let's you understand what your doing. if you are doing this the first time choose the manual variant, as it's taking you only a minute longer. Manual Setup Variant --------------------- Create a directory named 'lib' in your development folder and clone the django-mptt module (https://github.com/django-mptt/django-mptt) into it :: $ mkdir lib $ cd lib $ git clone git://github.com/django-mptt/django-mptt.git Change into your project root and create a symbolic link to the downloaded mptt module :: $ cd ../myFeinCMSSite/ $ ln -s ../lib/django-mptt/mptt/ mptt Step into the example app and start the runserver :: $ cd example $ ./manage.py runserver The username and password for the examples admin-interface are 'admin' and 'password' Quickstart Variant ------------------- Change into your project folder and run the setup script :: $ cd myFeinCMSSite $ ./quickstart.sh Wait while django and mptt are being fetched and then follow the on-screen instructions to start the runserver and enjoy the installation :: $ cd example $ ./manage.py runserver The username and password for the examples admin-interface are 'admin' and 'password' Further Steps ------------------- Feel free to delete all files you do not need for your installation: :: /docs/ /MANIFEST.in /quickstart.sh /setup.py /tests/ feincms-1.7.4/README.rst000066400000000000000000000111461212255543400146440ustar00rootroot00000000000000======================================== FeinCMS - An extensible Django-based CMS ======================================== When was the last time, that a pre-built software package you wanted to use got many things right, but in the end, you still needed to modify the core parts of the code just because it wasn't (easily) possible to customize the way, a certain part of the system behaved? Django came to rescue all of us, who were not happy with either doing everything on our own or customizing another software package until it was impossible to update. The biggest strength of a framework-like design is, that it tries not to have a too strong view of what the user should do. It should make some things easy, but just GET OUT OF THE WAY most of the time. Just after discovering the benefits of a framework-like approach to software design, we fall back into the rewrite everything all the time mindset and build a CMS which has very strong views how content should be structured. One rich text area, a media library and some templates, and we have a simple CMS which will be good enough for many pages. But what if we want more? If we want to be able to add custom content? What if the user can't be trusted to resize images before uploading them? What if you'd like to add a gallery somewhere in between other content? What if the user should be able to administer not only the main content, but also a sidebar, the footer? With FeinCMS, this does not sound too good to be true anymore. And it's not even complicated. FeinCMS is an extremely stupid content management system. It knows nothing about content -- just enough to create an admin interface for your own page content types. It lets you reorder page content blocks using a drag-drop interface, and you can add as many content blocks to a region (f.e. the sidebar, the main content region or something else which I haven't thought of yet). It provides helper functions, which provide ordered lists of page content blocks. That's all. Adding your own content types is extremely easy. Do you like textile that much, that you'd rather die than using a rich text editor? Then add the following code to your project, and you can go on using the CMS without being forced to use whatever the developers deemed best: :: from feincms.module.page.models import Page from django.contrib.markup.templatetags.markup import textile from django.db import models class TextilePageContent(models.Model): content = models.TextField() class Meta: abstract = True def render(self, **kwargs): return textile(self.content) Page.create_content_type(TextilePageContent) That's it. Not even ten code lines for your own page content type. Getting started =============== Visit these sites ----------------- * FeinCMS Website: http://www.feincms.org/ * Read the documentation: http://feincms-django-cms.readthedocs.org/ * See the Google Groups page at http://groups.google.com/group/django-feincms * FeinCMS on github: https://github.com/feincms/feincms/ IRC --- Visit us on IRC! We are hanging around in ``#feincms`` on freenode. If you do not have an IRC client you can use the `freenode Web IRC client `_. Quickstart ---------- You can find a short quickstart guide at QUICKSTART.rst Optional Packages ----------------- * `pytidylib `_ can be installed to perform HTML validation and cleanup using `HTML Tidy `_ while editing content. Install pytidylib and add ``FEINCMS_TIDY_HTML = True`` to your settings.py. * Alternately, `lxml `_ can be installed to perform silent HTML cleanup to remove non-standard markup while editing content. Install lxml and add ``cleanse=True`` when you register ``RichTextContent`` or ``SectionContent``:: RichTextContentType = Page.create_content_type(RichTextContent, cleanse=True) Repository branches ------------------- The FeinCMS repository on github has several branches. Their purpose and rewinding policies are described below. * ``maint``: Maintenance branch for the second-newest version of FeinCMS. * ``master``: Stable version of FeinCMS. ``master`` and ``maint`` are never rebased or rewound. * ``next``: Upcoming version of FeinCMS. This branch is rarely rebased if ever, but this might happen. A note will be sent to the official mailing list whenever ``next`` has been rebased. * ``pu`` or feature branches are used for short-lived projects. These branches aren't guaranteed to stay around and are not meant to be deployed into production environments. feincms-1.7.4/docs/000077500000000000000000000000001212255543400141025ustar00rootroot00000000000000feincms-1.7.4/docs/Makefile000066400000000000000000000056631212255543400155540ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf _build/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html @echo @echo "Build finished. The HTML pages are in _build/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) _build/dirhtml @echo @echo "Build finished. The HTML pages are in _build/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in _build/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) _build/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in _build/qthelp, like this:" @echo "# qcollectiongenerator _build/qthelp/FeinCMS.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile _build/qthelp/FeinCMS.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex @echo @echo "Build finished; the LaTeX files are in _build/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes @echo @echo "The overview file is in _build/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in _build/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in _build/doctest/output.txt." feincms-1.7.4/docs/_theme/000077500000000000000000000000001212255543400153435ustar00rootroot00000000000000feincms-1.7.4/docs/_theme/nature/000077500000000000000000000000001212255543400166415ustar00rootroot00000000000000feincms-1.7.4/docs/_theme/nature/static/000077500000000000000000000000001212255543400201305ustar00rootroot00000000000000feincms-1.7.4/docs/_theme/nature/static/nature.css_t000066400000000000000000000074401212255543400224700ustar00rootroot00000000000000/** * Sphinx stylesheet -- default theme * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: Arial, sans-serif; font-size: 100%; background-color: #111; color: #555; margin: 0; padding: 0; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } hr{ border: 1px solid #B1B4B6; } div.document { background-color: #eee; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 30px 30px; font-size: 0.8em; } div.footer { color: #555; width: 100%; padding: 13px 0; text-align: center; font-size: 75%; } div.footer a { color: #444; text-decoration: underline; } div.related { background-color: #6BA81E; line-height: 32px; color: #fff; text-shadow: 0px 1px 0 #444; font-size: 0.80em; } div.related a { color: #E2F3CC; } div.sphinxsidebar { font-size: 0.75em; line-height: 1.5em; } div.sphinxsidebarwrapper{ padding: 20px 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: Arial, sans-serif; color: #222; font-size: 1.2em; font-weight: normal; margin: 0; padding: 5px 10px; background-color: #ddd; text-shadow: 1px 1px 0 white } div.sphinxsidebar h4{ font-size: 1.1em; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p { color: #888; padding: 5px 20px; } div.sphinxsidebar p.topless { } div.sphinxsidebar ul { margin: 10px 20px; padding: 0; color: #000; } div.sphinxsidebar a { color: #444; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar input[type=text]{ margin-left: 20px; } /* -- body styles ----------------------------------------------------------- */ a { color: #005B81; text-decoration: none; } a:hover { color: #E32E00; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: Arial, sans-serif; background-color: #BED4EB; font-weight: normal; color: #212224; margin: 30px 0px 10px 0px; padding: 5px 0 5px 10px; text-shadow: 0px 1px 0 white } div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } div.body h2 { font-size: 150%; background-color: #C8D5E3; } div.body h3 { font-size: 120%; background-color: #D8DEE3; } div.body h4 { font-size: 110%; background-color: #D8DEE3; } div.body h5 { font-size: 100%; background-color: #D8DEE3; } div.body h6 { font-size: 100%; background-color: #D8DEE3; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li { line-height: 1.5em; } div.admonition p.admonition-title + p { display: inline; } div.highlight{ background-color: white; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 10px; background-color: White; color: #222; line-height: 1.2em; border: 1px solid #C6C9CB; font-size: 1.2em; margin: 1.5em 0 1.5em 0; -webkit-box-shadow: 1px 1px 1px #d8d8d8; -moz-box-shadow: 1px 1px 1px #d8d8d8; } tt { background-color: #ecf0f3; color: #222; padding: 1px 2px; font-size: 1.2em; font-family: monospace; } feincms-1.7.4/docs/_theme/nature/static/pygments.css000066400000000000000000000052351212255543400225150ustar00rootroot00000000000000.c { color: #999988; font-style: italic } /* Comment */ .k { font-weight: bold } /* Keyword */ .o { font-weight: bold } /* Operator */ .cm { color: #999988; font-style: italic } /* Comment.Multiline */ .cp { color: #999999; font-weight: bold } /* Comment.preproc */ .c1 { color: #999988; font-style: italic } /* Comment.Single */ .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .ge { font-style: italic } /* Generic.Emph */ .gr { color: #aa0000 } /* Generic.Error */ .gh { color: #999999 } /* Generic.Heading */ .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .go { color: #111 } /* Generic.Output */ .gp { color: #555555 } /* Generic.Prompt */ .gs { font-weight: bold } /* Generic.Strong */ .gu { color: #aaaaaa } /* Generic.Subheading */ .gt { color: #aa0000 } /* Generic.Traceback */ .kc { font-weight: bold } /* Keyword.Constant */ .kd { font-weight: bold } /* Keyword.Declaration */ .kp { font-weight: bold } /* Keyword.Pseudo */ .kr { font-weight: bold } /* Keyword.Reserved */ .kt { color: #445588; font-weight: bold } /* Keyword.Type */ .m { color: #009999 } /* Literal.Number */ .s { color: #bb8844 } /* Literal.String */ .na { color: #008080 } /* Name.Attribute */ .nb { color: #999999 } /* Name.Builtin */ .nc { color: #445588; font-weight: bold } /* Name.Class */ .no { color: #ff99ff } /* Name.Constant */ .ni { color: #800080 } /* Name.Entity */ .ne { color: #990000; font-weight: bold } /* Name.Exception */ .nf { color: #990000; font-weight: bold } /* Name.Function */ .nn { color: #555555 } /* Name.Namespace */ .nt { color: #000080 } /* Name.Tag */ .nv { color: purple } /* Name.Variable */ .ow { font-weight: bold } /* Operator.Word */ .mf { color: #009999 } /* Literal.Number.Float */ .mh { color: #009999 } /* Literal.Number.Hex */ .mi { color: #009999 } /* Literal.Number.Integer */ .mo { color: #009999 } /* Literal.Number.Oct */ .sb { color: #bb8844 } /* Literal.String.Backtick */ .sc { color: #bb8844 } /* Literal.String.Char */ .sd { color: #bb8844 } /* Literal.String.Doc */ .s2 { color: #bb8844 } /* Literal.String.Double */ .se { color: #bb8844 } /* Literal.String.Escape */ .sh { color: #bb8844 } /* Literal.String.Heredoc */ .si { color: #bb8844 } /* Literal.String.Interpol */ .sx { color: #bb8844 } /* Literal.String.Other */ .sr { color: #808000 } /* Literal.String.Regex */ .s1 { color: #bb8844 } /* Literal.String.Single */ .ss { color: #bb8844 } /* Literal.String.Symbol */ .bp { color: #999999 } /* Name.Builtin.Pseudo */ .vc { color: #ff99ff } /* Name.Variable.Class */ .vg { color: #ff99ff } /* Name.Variable.Global */ .vi { color: #ff99ff } /* Name.Variable.Instance */ .il { color: #009999 } /* Literal.Number.Integer.Long */feincms-1.7.4/docs/_theme/nature/theme.conf000066400000000000000000000001071212255543400206100ustar00rootroot00000000000000[theme] inherit = basic stylesheet = nature.css pygments_style = tango feincms-1.7.4/docs/admin.rst000066400000000000000000000215551212255543400157340ustar00rootroot00000000000000.. _admin: ========================= Administration interfaces ========================= FeinCMS provides two ModelAdmin classes, :class:`~feincms.admin.item_editor.ItemEditor`, and :class:`~feincms.admin.tree_editor.TreeEditor`. Their purpose and their customization hooks are briefly discussed here. The tree editor =============== .. module:: feincms.admin.tree_editor .. class:: TreeEditor The tree editor replaces the standard change list interface with a collapsible item tree. The model must be registered with `django-mptt `_ for this to work. .. image:: images/tree_editor.png Usage is as follows:: from django.db import models from mptt.fields import TreeForeignKey from mptt.models import MPTTModel class YourModel(MPTTModel): # model field definitions parent = TreeForeignKey('self', null=True, blank=True, related_name='children') class Meta: ordering = ['tree_id', 'lft'] # The TreeEditor needs this ordering definition And inside your ``admin.py`` file:: from django.contrib import admin from feincms.admin import tree_editor from yourapp.models import YourModel class YourModelAdmin(tree_editor.TreeEditor): pass admin.site.register(YourModel, YourModelAdmin) All standard :class:`~django.contrib.admin.options.ModelAdmin` attributes such as :attr:`ModelAdmin.list_display`, :attr:`ModelAdmin.list_editable`, :attr:`ModelAdmin.list_filter` work as normally. The only exception to this rule is the column showing the tree structure (the second column in the image). There, we always show the value of :attr:`Model.__unicode__` currently. AJAX checkboxes --------------- The tree editor allows you to define boolean columns which let the website administrator change the value of the boolean using a simple click on the icon. These boolean columns can be aware of the tree structure. For example, if an object's ``active`` flag influences the state of its descendants, the tree editor interface is able to show not only the state of the modified element, but also the state of all its descendants without having to reload the page. Currently, documentation for this feature is not available yet. You can take a look at the implementation of the ``is_visible`` and ``in_navigation`` columns of the page editor however. Usage:: from django.contrib import admin from feincms.admin import tree_editor import mptt class Category(models.Model): active = models.BooleanField() name = models.CharField(...) parent = models.ForeignKey('self', blank=True, null=True) # ... mptt.register(Category) class CategoryAdmin(tree_editor.TreeEditor): list_display = ('__unicode__', 'active_toggle') active_toggle = tree_editor.ajax_editable_boolean('active', _('active')) The item editor =============== .. module:: feincms.admin.item_editor .. class:: ItemEditor The tabbed interface below is used to edit content and other properties of the edited object. A tab is shown for every region of the template or element, depending on whether templates are activated for the object in question [#f1]_. Here's a screenshot of a content editing pane. The media file content is collapsed currently. New items can be added using the control bar at the bottom, and all content blocks can be reordered using drag and drop: .. image:: images/item_editor_content.png .. [#f1] Templates are required for the page module; blog entries managed through the item editor probably won't have a use for them. Customizing the item editor --------------------------- .. versionadded:: 1.2.0 * The :class:`~feincms.admin.item_editor.ItemEditor` now plays nicely with standard Django ``fieldsets``; the content-editor is rendered as a replacement for a fieldset with the placeholder name matching :const:`~feincms.admin.item_editor.FEINCMS_CONTENT_FIELDSET_NAME`. If no such fieldset is present, one is inserted at the top automatically. If you wish to customise the location of the content-editor, simple include this fieldset at the desired location:: from feincms.admin.item_editor import ItemEditor, FEINCMS_CONTENT_FIELDSET class MyAdmin(ItemEditor): fieldsets = ( ('Important things', {'fields': ('title', 'slug', 'etc')}), FEINCMS_CONTENT_FIELDSET, ('Less important things', { 'fields': ('copyright', 'soforth'), 'classes': ('collapse',) } ) ) Customizing the individual content type forms --------------------------------------------- Customizing the individual content type editors is easily possible through four settings on the content type model itself: * ``feincms_item_editor_context_processors``: A list of callables using which you may add additional values to the item editor templates. * ``feincms_item_editor_form``: You can specify the base class which should be used for the content type model. The default value is :class:`django.forms.ModelForm`. If you want to customize the form, chances are it is a better idea to set ``feincms_item_editor_inline`` instead. * ``feincms_item_editor_includes``: If you need additional JavaScript or CSS files or need to perform additional initialization on your content type forms, you can specify template fragments which are included in predefined places into the item editor. Currently, the only include region available is ``head``:: class ContentType(models.Model): feincms_item_editor_includes = { 'head': ['content/init.html'], } # ... If you need to execute additional Javascript, for example to add a TinyMCE instance, it is recommended to add the initialization functions to the ``contentblock_init_handlers`` array, because the initialization needs to be performed not only on page load, but also when adding new content blocks. Please note that these functions *will* be called several times, also several times on the same content types. It is your responsibility to ensure that the handlers aren't attached several times if this would be harmful. Additionally, several content types do not support being dragged. Rich text editors such as TinyMCE react badly to being dragged around - they are still visible, but the content disappears and nothing is clickable anymore. Because of this you might want to run routines before and after moving content types around. This is achieved by adding your JavaScript functions to the ``contentblock_move_handlers.poorify`` array for handlers to be executed before moving and ``contentblock_move_handlers.richify`` for handlers to be executed after moving. Please note that the item editor executes all handlers on every drag and drop, it is your responsibility to ensure that code is only executed if it has to. Take a look at the ``richtext`` item editor include files to understand how this should be done. * ``feincms_item_editor_inline``: .. versionadded:: 1.4.0 This can be used to override the ``InlineModelAdmin`` class used for the content type. The custom inline should inherit from ``FeinCMSInline`` or be configured the same way. If you override ``fieldsets`` or ``fields`` you **must** include ``region`` and ``ordering`` even though they aren't shown in the administration interface. Putting it all together ======================= It is possible to build a limited, but fully functional page CMS administration interface using only the following code (``urls.py`` and ``views.py`` are missing): ``models.py``:: from django.db import models from mptt.models import MPTTModel from feincms.models import create_base_model class Page(create_base_model(MPTTModel)): active = models.BooleanField(default=True) title = models.CharField(max_length=100) slug = models.SlugField() parent = models.ForeignKey('self', blank=True, null=True, related_name='children') def get_absolute_url(self): if self.parent_id: return u'%s%s/' % (self.parent.get_absolute_url(), self.slug) return u'/%s/' % self.slug ``admin.py``:: from django.contrib import admin from feincms.admin import item_editor, tree_editor from myapp.models import Page class PageAdmin(item_editor.ItemEditor, tree_editor.TreeEditor): fieldsets = [ (None, { 'fields': ['active', 'title', 'slug'], }), item_editor.FEINCMS_CONTENT_FIELDSET, ] list_display = ['active', 'title'] prepopulated_fields = {'slug': ('title',)} raw_id_fields = ['parent'] search_fields = ['title', 'slug'] admin.site.register(Page, PageAdmin) For a more complete (but also more verbose) implementation, have a look at the files inside :mod:`feincms/module/page/`. feincms-1.7.4/docs/advanced/000077500000000000000000000000001212255543400156475ustar00rootroot00000000000000feincms-1.7.4/docs/advanced/base.rst000066400000000000000000000011701212255543400173120ustar00rootroot00000000000000.. _tools-base: :class:`feincms.models.Base` --- CMS base class =============================================== This is the base class which you must inherit if you'd like to use the CMS to manage content with the :class:`~feincms.admin.item_editor.ItemEditor`. .. method:: Base.register_templates(*templates) .. method:: Base.register_regions(*regions) .. attribute:: Base.content .. method:: Base.create_content_type(model, regions=None, [**kwargs]) .. method:: Base.content_type_for(model) .. method:: Base.copy_content_from(obj) .. method:: Base.replace_content_with(obj) .. method:: Base.append_content_from(obj) feincms-1.7.4/docs/advanced/caching.rst000066400000000000000000000036651212255543400200070ustar00rootroot00000000000000.. _advanced-caching: Performance considerations ========================== While FeinCMS in its raw form is perfectly capable of serving out a medium sized site, more complicated setups quickly lead to death by database load. As the complexity of your pages grows, so do the number of database queries needed to build page content on each and every request. It is therefore a good idea to keep an eye open for excessive database queries and to try to avoid them. Denormalization --------------- FeinCMS comes bundled with the "ct_tracker" extension that will reduce the number of database queries needed by keeping some bookkeeping information duplicated in the base type. Caching ------- Caching rendered page fragments is probably the most efficient way of reducing database accesses in your FeinCMS site. An important consideration in the design of your site's templates is which areas of your pages depend on which variables. FeinCMS supplies a number of helper methods and variables, ready to be used in your templates. Here's an (incomplete) list of variables to use in {% cache %} blocks [#djangocache]_: * feincms_page.cache_key -- a string describing the current page. Depending on the extensions loaded, this varies with the page, the page's modification date, its language, etc. This is always a safe bet to use on page specific fragments. * LANGUAGE_CODE -- even if two requests are asking for the same page, the html code rendered might differ in translated elements in the navigation or elsewhere. If the fragment varies on language, include LANGUAGE_CODE in the cache specifier. * request.user.id -- different users might be allowed to see different views of the site. Add request.user.id to the cache specifier if this is the case. .. [#djangocache] Please see the django documentation for detailed description of the {% cache %} template tag. feincms-1.7.4/docs/advanced/designdecisions.rst000066400000000000000000000051171212255543400215570ustar00rootroot00000000000000.. _advanced-designdecisions: Software design considerations ============================== These are assorted ramblings copy-pasted from various emails. About rich text editors ----------------------- We have been struggling with rich text editors for a long time. To be honest, I do not think it was a good idea to add that many features to the rich text editor. Resizing images uploaded into a rich text editor is a real pain, and what if you'd like to reuse these images or display them using a lightbox script or something similar? You have to resort to writing loads of JavaScript code which will only work on one browser. You cannot really filter the HTML code generated by the user to kick out ugly HTML code generated by copy-pasting from word. The user will upload 10mb JPEGs and resize them to 50x50 pixels by himself. All of this convinced me that offering the user a rich text editor with too much capabilities is a really bad idea. The rich text editor in FeinCMS only has bold, italic, bullets, link and headlines activated (and the HTML code button, because that's sort of inevitable -- sometimes the rich text editor messes up and you cannot fix it other than going directly into the HTML code. Plus, if someone really knows what he's doing, I'd still like to give him the power to shot his own foot). If this does not seem convincing you can always add your own rich text content type with a different configuration (or just override the rich text editor initialization template in your own project). We do not want to force our world view on you, it's just that we think that in this case, more choice has the bigger potential to hurt than to help. Content blocks -------------- Images and other media files are inserted via objects; the user can only select a file and a display mode (f.e. float/block for images or something...). A page's content could look like this: * Rich Text * Floated image * Rich Text * YouTube Video Link, embedding code is automatically generated from the link * Rich Text It's of course easier for the user to start with only a single rich text field, but I think that the user already has too much confusing possibilities with an enhanced rich text editor. Once the user grasps the concept of content blocks which can be freely added, removed and reordered using drag/drop, I'd say it's much easier to administer the content of a webpage. Plus, the content blocks can have their own displaying and updating logic; implementing dynamic content inside the CMS is not hard anymore, on the contrary. Since content blocks are Django models, you can do anything you want inside them. feincms-1.7.4/docs/advanced/index.rst000066400000000000000000000007301212255543400175100ustar00rootroot00000000000000=============== Advanced topics =============== This section is targeted at more advanced users of FeinCMS. It goes into details which are not relevant for you if you only want to use the :mod:`~feincms.module.page` module or the media library on your site. However, if you want to understand the inner workings of the CMS, the design considerations and how to optimize your code, this section is for you. .. toctree:: base utils designdecisions caching feincms-1.7.4/docs/advanced/utils.rst000066400000000000000000000012371212255543400175440ustar00rootroot00000000000000.. _tools-utils: :mod:`feincms.utils` --- General utilities ========================================== .. module:: feincms.utils .. function:: get_object(path, [fail_silently]) Helper function which can be used to import a python object. ``path`` should be the absolute dotted path to the object. You can optionally pass ``fail_silently=True`` if the function should not raise an ``Exception`` in case of a failure to import the object:: MyClass = get_object('module.MyClass') myfunc = get_object('anothermodule.module2.my_function', fail_silently=True) .. function:: collect_dict_values(data) Converts a list of 2-tuples to a dict. feincms-1.7.4/docs/api/000077500000000000000000000000001212255543400146535ustar00rootroot00000000000000feincms-1.7.4/docs/api/admin.rst000066400000000000000000000007311212255543400164760ustar00rootroot00000000000000Admin classes ============= ItemEditor ---------- .. automodule:: feincms.admin.item_editor :members: :noindex: .. automodule:: feincms.templatetags.feincms_admin_tags :members: :noindex: TreeEditor ---------- .. automodule:: feincms.admin.tree_editor :members: :noindex: FilterSpec classes for ``list_filter`` customization ---------------------------------------------------- .. automodule:: feincms.admin.filterspecs :members: :noindex: feincms-1.7.4/docs/api/blog.rst000066400000000000000000000005401212255543400163270ustar00rootroot00000000000000Blog module =========== .. automodule:: feincms.module.blog.models :members: :noindex: Extensions ---------- Tagging ******* .. automodule:: feincms.module.blog.extensions.tags :members: :noindex: Blog entry translations *********************** .. automodule:: feincms.module.blog.extensions.translations :members: :noindex: feincms-1.7.4/docs/api/commands.rst000066400000000000000000000014171212255543400172110ustar00rootroot00000000000000Management commands =================== Database schema checker ----------------------- .. automodule:: feincms.management.checker :members: :noindex: Content-type specific management commands ----------------------------------------- .. automodule:: feincms.management.commands.update_rsscontent :members: :noindex: Page tree rebuilders -------------------- Those should not normally be used. Older versions of MPTT sometimes got confused with repeated saves and tree-structure changes. These management commands helped cleaning up the mess. .. automodule:: feincms.management.commands.rebuild_mptt :members: :noindex: Miscellaneous commands ---------------------- .. automodule:: feincms.management.commands.feincms_validate :members: :noindex: feincms-1.7.4/docs/api/contenttypes.rst000066400000000000000000000025511212255543400201470ustar00rootroot00000000000000Content types ============= ApplicationContent ------------------ .. automodule:: feincms.content.application.models :members: :noindex: CommentsContent --------------- .. automodule:: feincms.content.comments.models :members: :noindex: ContactFormContent ------------------ .. automodule:: feincms.content.contactform.models :members: :noindex: FileContent ----------- .. automodule:: feincms.content.file.models :members: :noindex: ImageContent ------------ .. automodule:: feincms.content.image.models :members: :noindex: MediaFileContent ---------------- .. automodule:: feincms.content.medialibrary.models :members: :noindex: RawContent ---------- .. automodule:: feincms.content.raw.models :members: :noindex: RichTextContent --------------- .. automodule:: feincms.content.richtext.models :members: :noindex: RSSContent ---------- .. automodule:: feincms.content.rss.models :members: :noindex: SectionContent -------------- .. automodule:: feincms.content.section.models :members: :noindex: TableContent ------------ .. automodule:: feincms.content.table.models :members: :noindex: TemplateContent --------------- .. automodule:: feincms.content.template.models :members: :noindex: VideoContent ------------ .. automodule:: feincms.content.video.models :members: :noindex: feincms-1.7.4/docs/api/contextprocessors.rst000066400000000000000000000001541212255543400212140ustar00rootroot00000000000000Context processors ================== .. automodule:: feincms.context_processors :members: :noindex: feincms-1.7.4/docs/api/contrib.rst000066400000000000000000000004321212255543400170440ustar00rootroot00000000000000Contrib ======= Model and form fields --------------------- .. automodule:: feincms.contrib.fields :members: :noindex: .. automodule:: feincms.contrib.richtext :members: :noindex: Tagging ------- .. automodule:: feincms.contrib.tagging :members: :noindex: feincms-1.7.4/docs/api/core.rst000066400000000000000000000003071212255543400163350ustar00rootroot00000000000000FeinCMS core ============ General functions ----------------- .. automodule:: feincms :members: :noindex: Base models ----------- .. automodule:: feincms.models :members: :noindex: feincms-1.7.4/docs/api/medialibrary.rst000066400000000000000000000007401212255543400200520ustar00rootroot00000000000000Media library ============= Models ------ .. automodule:: feincms.module.medialibrary.models :members: :noindex: Admin classes ------------- .. automodule:: feincms.module.medialibrary.modeladmins :members: :noindex: .. automodule:: feincms.module.medialibrary.forms :members: :noindex: .. automodule:: feincms.module.medialibrary.zip :members: :noindex: Fields ------ .. automodule:: feincms.module.medialibrary.fields :members: :noindex: feincms-1.7.4/docs/api/page.rst000066400000000000000000000040051212255543400163200ustar00rootroot00000000000000Page module =========== Models ------ .. automodule:: feincms.module.page.models :members: :noindex: Request and response processors ------------------------------- .. automodule:: feincms.module.page.processors :members: :noindex: Admin classes ------------- .. automodule:: feincms.module.page.modeladmins :members: :noindex: .. automodule:: feincms.module.page.forms :members: :noindex: Sitemap module -------------- .. automodule:: feincms.module.page.sitemap :members: :noindex: Extensions ---------- Page excerpts ************* .. automodule:: feincms.module.page.extensions.excerpt :members: :noindex: Navigation extensions ********************* .. automodule:: feincms.module.page.extensions.navigation :members: :noindex: Related pages ************* .. automodule:: feincms.module.page.extensions.relatedpages :members: :noindex: Symlinked page content ********************** .. automodule:: feincms.module.page.extensions.symlinks :members: :noindex: Flexible page titles ******************** .. automodule:: feincms.module.page.extensions.titles :members: :noindex: Extensions not specific to the page module ------------------------------------------ Creation and modification timestamps ************************************ .. automodule:: feincms.module.extensions.changedate :members: :noindex: Content type count denormalization ********************************** .. automodule:: feincms.module.extensions.ct_tracker :members: :noindex: Date-based publishing ********************* .. automodule:: feincms.module.extensions.datepublisher :members: :noindex: Featured items ************** .. automodule:: feincms.module.extensions.featured :members: :noindex: Search engine optimization fields ********************************* .. automodule:: feincms.module.extensions.seo :members: :noindex: Translations ************ .. automodule:: feincms.module.extensions.translations :members: :noindex: feincms-1.7.4/docs/api/settings.rst000066400000000000000000000001261212255543400172440ustar00rootroot00000000000000Settings ======== .. automodule:: feincms.default_settings :members: :noindex: feincms-1.7.4/docs/api/shortcuts.rst000066400000000000000000000001211212255543400174350ustar00rootroot00000000000000Shortcuts ========= .. automodule:: feincms.shortcuts :members: :noindex: feincms-1.7.4/docs/api/templatetags.rst000066400000000000000000000011601212255543400200750ustar00rootroot00000000000000Template tags ============= FeinCMS tags ------------ .. automodule:: feincms.templatetags.feincms_tags :members: :noindex: Thumbnail filters ----------------- .. automodule:: feincms.templatetags.feincms_thumbnail :members: :noindex: Page-module specific tags ------------------------- .. automodule:: feincms.module.page.templatetags.feincms_page_tags :members: :noindex: ``ApplicationContent`` tags --------------------------- .. automodule:: feincms.templatetags.applicationcontent_tags :members: :noindex: .. automodule:: feincms.templatetags.fragment_tags :members: :noindex: feincms-1.7.4/docs/api/translations.rst000066400000000000000000000001321212255543400201220ustar00rootroot00000000000000Translations ============ .. automodule:: feincms.translations :members: :noindex: feincms-1.7.4/docs/api/utils.rst000066400000000000000000000005501212255543400165450ustar00rootroot00000000000000Utilities ========= .. automodule:: feincms.utils :members: :noindex: HTML utilities -------------- .. automodule:: feincms.utils.html.cleanse :members: :noindex: .. automodule:: feincms.utils.html.tidy :members: :noindex: Template tag helpers -------------------- .. automodule:: feincms.utils.templatetags :members: :noindex: feincms-1.7.4/docs/api/views.rst000066400000000000000000000016461212255543400165510ustar00rootroot00000000000000Views and decorators ==================== .. automodule:: feincms.views.cbv.views :members: :noindex: Generic-views replacements -------------------------- All views in the ``feincms.views.generic`` module are almost the same as their counterparts in ``django.views.generic`` (before class-based views came along), except that they add a ``feincms_page`` object to the context. Not recommended anymore because they are deprecated in Django. Use the ``feincms.context_processors.add_page_if_missing`` context processor instead. .. automodule:: feincms.views.generic.simple :members: :noindex: .. automodule:: feincms.views.generic.list_detail :members: :noindex: .. automodule:: feincms.views.generic.date_based :members: :noindex: .. automodule:: feincms.views.generic.create_update :members: :noindex: Decorators ---------- .. automodule:: feincms.views.decorators :members: :noindex: feincms-1.7.4/docs/conf.py000066400000000000000000000147001212255543400154030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # FeinCMS documentation build configuration file, created by # sphinx-quickstart on Mon Aug 10 17:03:33 2009. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.append(os.path.abspath('.')) sys.path.append(os.path.abspath('..')) os.environ['DJANGO_SETTINGS_MODULE'] = 'example.settings' # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'FeinCMS' copyright = u'2009-2010, Feinheit GmbH and contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) import feincms version = '.'.join(map(str, feincms.VERSION)) # The full version, including alpha/beta/rc tags. release = feincms.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme_path = ['_theme'] html_theme = 'nature' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'FeinCMSdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). latex_paper_size = 'a4' # The font size ('10pt', '11pt' or '12pt'). latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'FeinCMS.tex', u'FeinCMS Documentation', u'Feinheit GmbH and contributors', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True feincms-1.7.4/docs/contenttypes.rst000066400000000000000000000463071212255543400174050ustar00rootroot00000000000000.. _contenttypes: ================================================== Content types - what your page content is built of ================================================== You will learn how to add your own content types and how you can render them in a template. What is a content type anyway? ============================== In FeinCMS, a content type is something to attach as content to a base model, for example a CMS Page (the base model) may have several rich text components associated to it (those would be RichTextContent content types). Every content type knows, amongst other things, how to render itself. Think of content types as "snippets" of information to appear on a page. Rendering contents in your templates ==================================== Simple: ::
{% block content %} {% for content in feincms_page.content.main %} {{ content.render }} {% endfor %} {% endblock %}
Implementing your own content types =================================== The minimal content type is an abstract Django model with a :func:`render` method, nothing else:: class TextileContent(models.Model): content = models.TextField() class Meta: abstract = True def render(self, **kwargs): return textile(self.content) All content types' :func:`render` methods must accept ``**kwargs``. This allows easily extending the interface with additional parameters. But more on this later. FeinCMS offers a method on :class:`feincms.models.Base` called :func:`create_content_type` which will create concrete content types from your abstract content types. Since content types can be used for different CMS base models such as pages and blog entries (implementing a rich text or an image content once and using it for both models makes lots of sense) your implementation needs to be abstract. :func:`create_content_type` adds a few utility methods and a few model fields to build the concrete type, a foreign key to the base model (f.e. the :class:`Page`) and several properties indicating where the content block will be positioned in the rendered result. .. note:: The examples on this page assume that you use the :class:`~feincms.module.page.models.Page` CMS base model. The principles outlined apply for all other CMS base types. The complete code required to implement and include a custom textile content type is shown here:: from feincms.module.page.models import Page from django.contrib.markup.templatetags.markup import textile from django.db import models class TextilePageContent(models.Model): content = models.TextField() class Meta: abstract = True def render(self, **kwargs): return textile(self.content) Page.create_content_type(TextilePageContent) There are three field names you should not use because they are added by ``create_content_type``: These are ``parent``, ``region`` and ``ordering``. These fields are used to specify the place where the content will be placed in the output. Customizing the render method for different regions =================================================== The default ``render`` method uses the region key to find a render method in your concrete content type and calls it. This allows you to customize the output depending on the region; you might want to show the same content differently in a sidebar and in the main region for example. If no matching method has been found a ``NotImplementedError`` is raised. This ``render`` method tries to be a sane default, nothing more. You can simply override it and put your own code there if you do not any differentiation, or if you want to do it differently. All ``render`` methods should accept ``**kwargs``. Some render methods might need the request, for example to determine the correct Google Maps API key depending on the current domain. The two template tags ``feincms_render_region`` and ``feincms_render_content`` pass the current rendering context as a keyword argument too. The example above could be rewritten like this:: {% load feincms_tags %}
{% block content %} {% for content in feincms_page.content.main %} {% feincms_render_content content request %} {% endfor %} {% endblock %}
Or even like this:: {% load feincms_tags %}
{% block content %} {% feincms_render_region feincms_page "main" request %} {% endblock %}
This does exactly the same, but you do not have to loop over the page content blocks yourself. You need to add the request context processor to your list of context processors for this example to work. .. _contenttypes-extramedia: Extra media for content types ============================= Some content types require extra CSS or javascript to work correctly. The content types have a way of individually specifying which CSS and JS files they need. The mechanism in use is almost the same as the one used in `form and form widget media`_. .. _`form and form widget media`: http://docs.djangoproject.com/en/dev/topics/forms/media/ Include the following code in the `` section of your template to include all JS and CSS media file definitions:: {{ feincms_page.content.media }} The individual content types should use a ``media`` property do define the media files they need:: from django import forms from django.db import models from django.template.loader import render_to_string class MediaUsingContentType(models.Model): album = models.ForeignKey('gallery.Album') class Meta: abstract = True @property def media(self): return forms.Media( css={'all': ('gallery/gallery.css',),}, js=('gallery/gallery.js',), ) def render(self, **kwargs): return render_to_string('content/gallery/album.html', { 'content': self, }) Please note that you can't define a ``Media`` inner class (yet). You have to provide the ``media`` property yourself. As with form and widget media definitions, either ``STATIC_URL`` or ``MEDIA_URL`` (in this order) will be prepended to the media file path if it is not an absolute path already. Alternatively, you can use the ``media_property`` function from django.forms to implement the functionality, which then also supports inheritance of media files:: from django.forms.widgets import media_property class MediaUsingContentType(models.Model): class Media: js = ('whizbang.js',) MediaUsingContentType.media = media_property(MediaUsingContentType) .. _contenttypes-processfinalize: Influencing request processing through a content type ===================================================== Since FeinCMS 1.3, content types are not only able to render themselves, they can offer two more entry points which are called before and after the response is rendered. These two entry points are called :func:`process` and :func:`finalize`. :func:`process` is called before rendering the template starts. The method always gets the current request as first argument, but should accept ``**kwargs`` for later extensions of the interface. This method can short-circuit the request-response-cycle simply by returning any response object. If the return value is a ``HttpResponse``, the standard FeinCMS view function does not do any further processing and returns the response right away. As a special case, if a :func:`process` method returns ``True`` (for successful processing), ``Http404`` exceptions raised by any other content type on the current page are ignored. This is especially helpful if you have several ``ApplicationContent`` content types on a single page. :func:`finalize` is called after the response has been rendered. It receives the current request and response objects. This function is normally used to set response headers inside a content type or do some other post-processing. If this function has any return value, the FeinCMS view will return this value instead of the rendered response. Here's an example form-handling content which uses all of these facilities:: class FormContent(models.Model): class Meta: abstract = True def process(self, request, **kwargs): if request.method == 'POST': form = FormClass(request.POST) if form.is_valid(): # Do something with form.cleaned_data ... return HttpResponseRedirect('?thanks=1') else: form = FormClass() self.rendered_output = render_to_string('content/form.html', { 'form': form, 'thanks': request.GET.get('thanks'), }) def render(self, **kwargs): return getattr(self, 'rendered_output', u'') def finalize(self, request, response): # Always disable caches if this content type is used somewhere response['Cache-Control'] = 'no-cache, must-revalidate' .. note:: Please note that the ``render`` method should not raise an exception if ``process`` has not been called beforehand. .. warning:: The FeinCMS page module views guarantee that ``process`` is called beforehand, other modules may not do so. ``feincms.module.blog`` for instance does not. Bundled content types ===================== Application content ------------------- .. module:: feincms.content.application.models .. class:: ApplicationContent() Used to let the administrator freely integrate 3rd party applications into the CMS. Described in :ref:`integration-applicationcontent`. Comments content ---------------- .. module:: feincms.content.comments.models .. class:: CommentsContent() Comment list and form using ``django.contrib.comments``. Contact form content -------------------- .. module:: feincms.content.contactform.models .. class:: ContactFormContent() Simple contact form. Also serves as an example how forms might be used inside content types. Inline files ------------ .. module:: feincms.content.file.models .. class:: FileContent() Simple content types holding just a file. You should probably use the MediaFileContent though. Inline images ------------- .. module:: feincms.content.image.models .. class:: ImageContent() Simple content types holding just an image with a position. You should probably use the MediaFileContent though. Additional arguments for :func:`~feincms.models.Base.create_content_type`: * ``POSITION_CHOICES`` * ``FORMAT_CHOICES`` Media library integration ------------------------- .. module:: feincms.content.medialibrary.v2 .. class:: MediaFileContent() Mini-framework for arbitrary file types with customizable rendering methods per-filetype. Add 'feincms.module.medialibrary' to INSTALLED_APPS. Additional arguments for :func:`~feincms.models.Base.create_content_type`: * ``TYPE_CHOICES``: (mandatory) A list of tuples for the type choice radio input fields. This field allows the website administrator to select a suitable presentation for a particular media file. For example, images could be shown as thumbnail with a lightbox or offered as downloads. The types should be specified as follows for this use case:: ..., TYPE_CHOICES=(('lightbox', _('lightbox')), ('download', _('as download'))), The ``MediaFileContent`` tries loading the following templates in order for a particular image media file with type ``download``: * ``content/mediafile/image_download.html`` * ``content/mediafile/image.html`` * ``content/mediafile/download.html`` * ``content/mediafile/default.html`` The media file type is stored directly on :class:`~feincms.module.medialibrary.models.MediaFile`. The file type can also be used to select templates which can be used to further customize the presentation of mediafiles, f.e. ``content/mediafile/swf.html`` to automatically generate the necessary ```` and ```` tags for flash movies. Raw content ----------- .. module:: feincms.content.raw.models .. class:: RawContent() Raw HTML code, f.e. for flash movies or javascript code. Rich text --------- .. module:: feincms.content.richtext.models .. class:: RichTextContent() Rich text editor widget, stripped down to the essentials; no media support, only a few styles activated. The necessary javascript files are not included, you need to put them in the right place on your own. By default, ``RichTextContent`` expects a TinyMCE activation script at ``js/tiny_mce/tiny_mce.js``. This can be customized by overriding ``FEINCMS_RICHTEXT_INIT_TEMPLATE`` and ``FEINCMS_RICHTEXT_INIT_CONTEXT`` in your ``settings.py`` file. If you only want to provide a different path to the TinyMCE javascript file, you can do this as follows:: FEINCMS_RICHTEXT_INIT_CONTEXT = { 'TINYMCE_JS_URL': '/your_custom_path/tiny_mce.js', } If you pass cleanse=True to the create_content_type invocation for your RichTextContent types, the HTML code will be cleansed right before saving to the database everytime the content is modified. Additional arguments for :func:`~feincms.models.Base.create_content_type`: * ``cleanse``: Whether the HTML code should be cleansed of all tags and attributes which are not explicitly whitelisted. The default is ``False``. RSS feeds --------- .. module:: feincms.content.rss.models .. class:: RSSContent A feed reader widget. This also serves as an example how to build a content type that needs additional processing, in this case from a cron job. If an RSS feed has been added to the CMS, ``manage.py update_rsscontent`` should be run periodically (either through a cron job or through other means) to keep the shown content up to date. The `feedparser` module is required. Section content --------------- .. module:: feincms.content.section.models .. class:: SectionContent() Combined rich text editor, title and media file. Table content ------------- .. module:: feincms.content.table.models .. class:: TableContent() The default configuration of the rich text editor does not include table controls. Because of this, you can use this content type to provide HTML table editing support. The data is stored in JSON format, additional formatters can be easily written which produce the definitive HTML representation of the table. Template content ---------------- .. module:: feincms.content.template.models .. class:: TemplateContent() This is a content type that just includes a snippet from a template. This content type scans all template directories for templates below ``content/template/`` and allows the user to select one of these templates which are then rendered using the Django template language. Note that some file extensions are automatically filtered so they won't appear in the list, namely anything that matches *.~ and *.tmp will be ignored. Also note that a template content is not sandboxed or specially rendered. Whatever a django template can do a TemplateContent snippet can do too, so be careful whom you grant write permissions. Video inclusion code for youtube, vimeo etc. -------------------------------------------- .. module:: feincms.content.video.models .. class:: VideoContent A easy-to-use content type that automatically generates Flash video inclusion code from a website link. Currently only YouTube and Vimeo links are supported. Restricting a content type to a subset of regions ================================================= Imagine that you have developed a content type which really only makes sense in the sidebar, not in the main content area. It is very simple to restrict a content type to a subset of regions, the only thing you have to do is pass a tuple of region keys to the create_content_type method:: Page.create_content_type(SomeSidebarContent, regions=('sidebar',)) Note that the restriction only influences the content types shown in the "Add new item"-dropdown in the item editor. The user may still choose to add the SomeSidebarContent to the sidebar, for example, and then proceed to move the content item into the main region. Design considerations for content types ======================================= Because the admin interface is already filled with information, it is sometimes easier to keep the details for certain models outside the CMS content types. Complicated models do not need to be edited directly in the CMS item editor, you can instead use the standard Django administration interface for them, and integrate them into FeinCMS by utilizing foreign keys. Already the bundled FileContent and ImageContent models can be viewed as bad style in this respect, because if you want to use a image or file more than once you need to upload it for every single use instead of being able to reuse the uploaded file. The media library module and MediaFileContent resolve at least this issue nicely by allowing the website administrator to attach metadata to a file and include it in a page by simply selecting the previously uploaded media file. Configuring and self-checking content types at creation time ============================================================ So you'd like to check whether Django is properly configured for your content type, or maybe add model/form fields depending on arguments passed at content type creation time? This is very easy to achieve. The only thing you need to do is adding a classmethod named :func:`initialize_type` to your content type, and pass additional keyword arguments to :func:`create_content_type`. If you want to see an example of these two uses, have a look at the :class:`~feincms.content.medialibrary.v2.MediaFileContent`. It is generally recommended to use this hook to configure content types compared to putting the configuration into the site-wide settings file. This is because you might want to configure the content type differently depending on the CMS base model that it is used with. Obtaining a concrete content type model ======================================= The concrete content type models are stored in the same module as the CMS base class, but they do not have a name using which you could import them. Accessing internal attributes is hacky, so what is the best way to get a hold onto the concrete content type? There are two recommended ways. The example use a ``RawContent`` content type and the Page CMS base class. You could take advantage of the fact that ``create_content_type`` returns the created model:: from feincms.module.page.models import Page from feincms.content.raw.models import RawContent PageRawContent = Page.create_content_type(RawContent) Or you could use :func:`content_type_for`:: from feincms.content.raw.models import RawContent PageRawContent = Page.content_type_for(RawContent) feincms-1.7.4/docs/contributing.rst000066400000000000000000000015201212255543400173410ustar00rootroot00000000000000.. _contributing: ========================================== Contributing to the development of FeinCMS ========================================== Repository branches =================== The FeinCMS repository on github has several branches. Their purpose and rewinding policies are described below. * ``maint``: Maintenance branch for the second-newest version of FeinCMS. * ``master``: Stable version of FeinCMS. ``master`` and ``maint`` are never rebased or rewound. * ``next``: Upcoming version of FeinCMS. This branch is rarely rebased if ever, but this might happen. A note will be sent to the official mailing list whenever ``next`` has been rebased. * ``pu`` or feature branches are used for short-lived projects. These branches aren't guaranteed to stay around and are not meant to be deployed into production environments. feincms-1.7.4/docs/deprecation.rst000066400000000000000000000070551212255543400171400ustar00rootroot00000000000000.. _deprecation: ============================ FeinCMS Deprecation Timeline ============================ This document outlines when various pieces of FeinCMS will be removed or altered in backward incompatible way. Before a feature is removed, a warning will be issued for at least two releases. 1.6 === * The value of ``FEINCMS_REVERSE_MONKEY_PATCH`` has been changed to ``False``. * Deprecated page manager methods have been removed (``page_for_path_or_404``, ``for_request_or_404``, ``best_match_for_request``, ``from_request``) - ``Page.objects.for_request()``, ``Page.objects.page_for_path`` and ``Page.objects.best_match_for_path`` should cover all use cases. * Deprecated page methods have been removed (``active_children``, ``active_children_in_navigation``, ``get_siblings_and_self``) * Request and response processors have to be imported from :mod:`feincms.module.page.processors`. Additionally, they must be registered individually by using ``register_request_processor`` and ``register_response_processor``. * Prefilled attributes have been removed. Use Django's ``prefetch_related`` or ``feincms.utils.queryset_transform`` instead. * ``feincms.views.base`` has been moved to ``feincms.views.legacy``. Use ``feincms.views.cbv`` instead. * ``FEINCMS_FRONTEND_EDITING``'s default has been changed to ``False``. * The code in :mod:`feincms.module.page.models` has been split up. The admin classes are in :mod:`feincms.module.page.modeladmin`, the forms in :mod:`feincms.module.page.forms` now. Analogous changes have been made to :mod:`feincms.module.medialibrary.models`. 1.7 === * The monkeypatch to make Django's :func:`django.core.urlresolvers.reverse` applicationcontent-aware will be removed. Use :func:`feincms.content.application.models.app_reverse` and the corresponding template tag instead. * The module :mod:`feincms.content.medialibrary.models` will be replaced by the contents of :mod:`feincms.content.medialibrary.v2`. The latter uses Django's ``raw_id_fields`` support instead of reimplementing it badly. * The legacy views inside :mod:`feincms.views.legacy` will be removed. 1.8 === * The module ``feincms.admin.editor`` will be removed. The model admin classes have been available in :mod:`feincms.admin.item_editor` and :mod:`feincms.admin.tree_editor` since FeinCMS v1.0. * Cleansing the HTML of a rich text content will still be possible, but the cleansing module :mod:`feincms.utils.html.cleanse` will be removed. When creating a rich text content, the ``cleanse`` argument must be a callable and cannot be ``True`` anymore. The cleansing function has been moved into its own package, `feincms-cleanse `_. * Registering extensions using shorthand notation will be not be possible in FeinCMS v1.8 anymore. Use the following method instead:: Page.register_extensions( 'feincms.module.page.extensions.navigation', 'feincmc.module.extensions.ct_tracker', ) * ``feincms_navigation`` and ``feincms_navigation_extended`` will be removed. Their functionality is provided by ``feincms_nav`` instead. * The function-based generic views aren't available in Django after v1.4 anymore. :mod:`feincms.views.generic` and :func:`feincms.views.decorators.add_page_to_extra_context` will be removed as well. * The module :mod:`feincms.content.medialibrary.v2`, which is only an alias for :mod:`feincms.content.medialibrary.models` starting with FeinCMS v1.7 will be removed. * ``Page.setup_request()`` does not do anything anymore and will be removed. feincms-1.7.4/docs/extensions.rst000066400000000000000000000044151212255543400170370ustar00rootroot00000000000000.. _extensions: Extensions ========== The extensions mechanism has been refactored to remove the need to make models know about their related model admin classes. The new module :py:mod:`feincms.extensions` contains mixins and base classes - their purpose is as follows: .. class:: feincms.extensions.ExtensionsMixin This mixin provides the ``register_extensions`` method which is the place where extensions are registered for a certain model. Extensions can be specified in the following ways: - Subclasses of :py:class:`~feincms.extensions.Extension` - Dotted Python module paths pointing to a subclass of the aforementioned extension class - Dotted Python module paths pointing to a module containing either a class named ``Extension`` or a function named ``register`` (for legacy extensions) .. class:: feincms.extensions.Extension This is the base class for your own extension. It has the following methods and properties: .. attribute:: model The model class. .. method:: handle_model(self) The method which modifies the Django model class. The model class is available as ``self.model``. .. method:: handle_modeladmin(self, modeladmin) This method receives the model admin instance bound to the model. This method could be called more than once, especially when using more than one admin site. .. class:: feincms.extensions.ExtensionModelAdmin() This is a model admin subclass which knows about extensions, and lets the extensions do their work modifying the model admin instance after it has been successfully initialized. It has the following methods and properties: .. method:: initialize_extensions(self) This method is automatically called at the end of initialization and loops through all registered extensions and calls their ``handle_modeladmin`` method. .. method:: add_extension_options(self, \*f) This is a helper to add fields and fieldsets to a model admin instance. Usage is as follows:: modeladmin.add_extension_options('field1', 'field2') Or:: modeladmin.add_extension_options(_('Fieldset title'), { 'fields': ('field1', 'field2'), }) feincms-1.7.4/docs/faq.rst000066400000000000000000000045211212255543400154050ustar00rootroot00000000000000.. _faq: ========================== Frequently Asked Questions ========================== This FAQ serves two purposes. Firstly, it does what a FAQ generally does -- answer frequently asked questions. Secondly, it is also a place to dump fragments of documentation which haven't matured enough to be moved into their own documentation file. Should I extend the builtin modules and contents, or should I write my own? =========================================================================== The answer is, as often, the nearly useless "It depends". The built-in modules serve two purposes: On one hand, they should be ready to use and demonstrate the power of FeinCMS. On the other hand, they should be simple enough to serve as examples for you if you want to build your own CMS-like system using the tools provided by FeinCMS. If a proposed feature greatly enhances the modules' or content types' abilities without adding heaps of code, chances are pretty good that it will be accepted into FeinCMS core. Anyway, the tools included should be so easy to use that you might still want to build your own page CMS, if your needs are very different from those of the original authors. If you don't like monkey patching at all, or if the list of extensions you want to use grows too big, it might be time to reconsider whether you really want to use the extension mechanism or if it might not be easier to start freshly, only using the editor admin classes, feincms.models.Base and maybe parts of the included PageManager... I run ``syncdb`` and get a message about missing columns in the page table ========================================================================== You enabled the page module (added :mod:`feincms.module.page` to ``INSTALLED_APPS``), run syncdb, and afterwards registered a few extensions. The extensions you activated (:mod:`~feincms.module.page.extensions.datepublisher` and :mod:`~feincms.module.page.extensions.translations`) add new fields to the page model, but your first ``syncdb`` did not know about them and therefore did not create the columns for those extensions. You can either remove the line ``Page.register_extensions(...)`` from your code or drop the page_page table and re-run ``syncdb``. If you want to keep the pages you've already created, you need to figure out the correct ALTER TABLE statements for your database yourself. feincms-1.7.4/docs/images/000077500000000000000000000000001212255543400153475ustar00rootroot00000000000000feincms-1.7.4/docs/images/item_editor_content.png000066400000000000000000001073441212255543400221240ustar00rootroot00000000000000PNG  IHDR-L<gAMA aPLTE6o:q?qCtBtAvBwBwCyJ{V}^cehrwutv~ƁȂɃ˅̊ȋ͉̉όώѐґӓԕԘЛΚ՚؝؟ڡۣܣݢߧިݫެ߬߷ױҰϱͱʴøxtt}}}|wuwnox`i|bck\Z`PXaAKa4;P(&2H95eFKTD] Wl+YḊf E E9ܽjq(W0f͚-yٳ̞5I^?L "{$챚[^\\L6"#.>KMY"sXqgP5g x 1 11qQ6ج9Rb""bY3l'2zqܵ0!,܈pkaO֘w Eq *)(EEg?C se^|Ac =>{|(sq(j=3_(g6?X XCHADbL=V@SqKD@ =f$1bhIkқg8O@R_OKBMKMK_gQ?樅B#QVcZs#*#nA2U QEBEO?jR)2_S%c 6-1GwEΜ"I^Mb!CH֕Įw\pccȞ;B"İnyB1̄Hb<s,5%նJJhYS) fHJYQfȷdϠ@o_H k :2z:K-E)u(r #$ϓ_*&MjRVYK2CEY)EyߐB3-<Fbfy1̠-ư+´sp%W`1lĭyXspeLQ•!dPϛ2WD_< -C-K-+i9ZZfK[J YϕSk9\I8*PoJZU:ndžDDGȨWZΐ7ODj ԤTgHIŠ[RPPɨʨJ~%!E H|%gh(6z*{,DqBg?A k1:{,(: "e` .5ڕ}J> ƚ3Ef#UQ"tΙ5̙p(^~1Fg b zb 0ELdMQlo(0Q^QF0tD[̀tL)"BdQ(DYKx2{.7k ru@+ϙ,%rjڞ+1q8Jbc6 cBĘGt 1(Wrec\m$XUx@G}U??jXwY5 9wkjqq9!8v-Ny 8\'I6IF=5l݄kz gEɯfBj]XΫb0«;;8 \΃gtptgՄnՄ*NzܡLŸzVß8+Zv\̽ރbW2~G5޻鍐{MWYgRګ\>x,ō$PU).H|HPfnNRQR8XH?/H4:}Ir57:]EU ;_{Y'ڛI- TTPTJ[r'ib9}lܡ J=K?\G ~Vt8\lZJt8h{&p:n#&} 7i/FMhaԭRb/H_lRhd{'yqr6!Ÿνޛ\k+&V');R^|Ho>q^w3wY UɵX3sI5 'py)JoNlp*Fe"o (. 1&1L׮M-;$NP~ Ab P 4(  >ƁHr#)-X=|8QB/R>jnSUS`(Di qfiE,As?~$ X >~B'caOpK% A(==T `˰"iX!h>80< \@wbŀΝ;4`_-)h|| b!:3F$=[Bsup; j ?z07`(7GLa"$(98HGuZPDG<y^ax_+X  Q@ABÇk@h??g@)  hy0=iS࣡P_y?B+> ͇ݝC,ܭ3u!!4u@`.Q.㛓@ꇇyBV  U  ɇPhT!Hz9>z8 t7!Ј:*z '_PAP^0yfa |+6SMOs/!@[iƂcu`:!OS?A@~}j0 +UrCM| 4҅Aa{ 6j ؇ǃjC^QC^Z}F>jCXg^,3_|?#TkLv yxCC=߉R@ AZ *#tΣHkN;l;11#:oc #,48ԠŃ)د7-FPs5a F.&z "1Hl$+ayF? =Uz艉&<Яe 2B ]0C`t}"LC}?b+sKn>4rm5}͉EcNt?h] b|6{ c]A =60/Ox zj>p!`8sG@KjÈR@ˣGC* (?Gmp(zyāgl$jpzkTIF 9P }R,6<C쎼A_!ށ}gBܟmeฐρjQj ư2@u =4Mlm W2ۛB5hL*`s`*=,K+F7Ҋy{)hwyf:zOnqp%3Y-|}ը/wTx9܊L])6 F[22Q[t'g&<\{#[e~ `1Eu[kS':S׌'4 f;QV %[3h'@&x$x閞^%ƿOo&O >]d٤~ 1MA>W}ڂ$n1eE%E$JJJ!cm#4 $Ы'f&؈Kz1JJJK^-J/E;k~ ly!b41HpetF2<lt*!Y%b'nb:;OsK8^h43i}0?^Yy0/<1٣ă&n TB]MBNn~p}M]Ë`[?WtT?GE 4߯fƺIC(t Cf5k>%~x)\|f䤉хBP ۗE\m)B[5Yz` h]m]C} f蟵Pcݓ(έavM3AFH 79Bu5D)vDI6jjAbX{ ڏ '_L.}7%Y(h}x#uMA SwA:zjjVeQDR#e{«GܞtPuԳ"aɥNaZ~SMGm4S\Ja^Z/`411Nw_{TU >x_V.= _[̾Tse?MxCfi[_~v@YO D甈U!r; 4֌$v;FL=V8ª/Ռ7TIÚ밪a͟tiVgiƶe0=tDk$;[b5fi$F}f\#/L=nq|~ f*+q+V\)b*9U >b4qPSSv ݷ?^}{{56M; o]oܿ cKGGځ]N5].vdp۶DAncn]9Ύko_ bXsh$pÚq]>m٨6x8ٽM: hmnrA-HnduG4 պ4+ǣ _|+.&VQn~"b@k M@\ ˒}-8 PXyj}]M߮gshUr_sG%='ȶmL4MC[oe v|{2!nXLv=[Pkd%<ɡ '^KS\k?~MkKˡYTCV;C~W\rV.ceJJImU~b91p|oط޹}`Y0ΟuFq GB]}K>7!-Gm#>:CWqY!#͟Kc^Z;l&!9s[Kz8Vu@Bm#UU}i?]Yj.Z 4c+PTuUF~kx{ɭ߱+.U⳶„_Pd;b7|tF;c|b7Աx7Q0F OV=!j2JKdT瘘 ֿr=" D7gNM73L!UW 3[AM bCU)^78E-.--;\^vޕML+16rl vT_=ZgZ]m8sRaiB*WX ok.s1nF|I<'Ogf#gf.Vy!3(*^Y% .Z` ,Z_V%TzNO&^92,zP ˢJ*eOkeI JW#Q,`',ŒX%'FjY !}.8>^5?Uwf|CvĘƥGGԢB/Bi٫Gk K7K KR'ƁL/BkL5%/ąK;xq&_<)<0.1Qߒ.51PSC# .y'߻&iqєzi#F|Nכf*'Cq6g%D#1d1MIb 11jzaސdAN\z.z-2i_)1:5^;dxo6YM7^#*хri1)Yj굜F?,%j-ƍ;W:xnX/y11j9.[>Sx/ĢHb`s<'9/ 0pn*:H ]6i~[#Lm6$1bb;2A;g0촶| {B:6m?S5aX39gBrt[{zPsj}ZC[c}!Ϗ|MU<5IbS)~7{XjkHl-].$N3|cjvI]M<юx (*?8YIu'Mt%sꌋ#"QA>fbЈCԤFoaԸ, "@=ˈH)/+8O9~%ކACJJFjMƪ(DJV7ܾp~vLTdQxr#<~qۈp?k; m~./B#D9pb3D4D8hJbΆg~v,H)8m{h݆Ҙ0mHby101"#pNE'ԆߐeG'ebt3b#I5|t 7"<^UxKXR;aH:^ʏ8Qb$eh%\\yxDRv қyHKAqߙף+<Q n6:"1jӡ"32/Z3~3"XVDxuA$䟭Ւg1Ԋ# "8V9 j򏶒wg7:z)dӿes/ON03jh8C8QG$zx =j.(+=xw, $Hb A$ $Hb AA>mh5Փ/ley'HLG4fKIv>Ibů$#Ab+|ܳE"4W]NZ F5X J01$ лE .:B\I{ONH]Xmqј#H@~LR嫯_ΦL(RN#_[g3S+4Hg7P7p'Yw6;56H$ƻEN$N!hkA͡|~v%[vH#FԶ0bh' ùFz^OH#D5BA"wΈ"bl+kl-iƺT(rTn1zA%|t^C|w&]O(5.1o( ܑLm|;M $1Hb "<&0vZ^ H^ L+s%d| AI c'ON<^H\N키Nn'u n ]|#\tř,II]hsg֣/F“#eG_5ft(2'5uvD!:I$ט c[j.No->_{_Up"K/G_PQtc'إ!bL)+b,X޿&| g^t#+@8'%3C!)nR521z=ew:I߹,pGAsfv^'cbbJ9p!#$1^ګ|lzA!kR{ ^d~Ͻ&Ew[POY}~jv߆>~?V9KoJ&\z(Iva@Tm;m/Fv!1`{Nޡ:^@.D1oN3a/X(-'Hbg,M x%Wyş /06g;~mXnl"H۫׆\{]F1OG5b/>[#BoM}@ %ԿJE1fRH=ZyH.qvtٖSy)#ks8n 6#xbpPw)f|;d oX_g.g9ءNcbt[\.m&&,5dhx!:yvJ|eن}d-ϛ2/4w'wx. ̶#"LKEU&!mشnwh+sѱTQsߑPd2Z 1Pwy'1@މF nkz(1H+c3:n{[D5[ .*9vÉ'5ˬ[wn¯Nc3Ybtmm3E+8 _5~-SE ]n{&$DmSsgrE\٪Iݢf{/ w@cr/ Y c ꪆ1RurU˵ BTB}CO&Kt'@ʓ&2]c-?ة(I 愬g1 P߆-PdX:&"|G+U9^'OߦaMq_̄`dW8SRTidDVC]*Ο5,VUSbQǪk/| S F|P]} 7$@! M0U|.?O/[-KG[?Z Р&{#>;gkg7*#DI߼4ϔ 6͓ҩ&&gĸ]h VTȭ!^xԱѳ5ЉXPNKC#,6II_}_=g69Qrqu F{klSh fۚ'Ltul;;n5ئ-V9 xn35Wө;v qu'2:LtpP>.]m;T?8joop^1*{}I#HbLtJRPt[~])UȖZb~+ӓj'{>2?Y1wl4 j] 8G7:KpؕeTaWRv=б%yȮn}v/tf-fFiOΒ!V?8[;vՐĘ<ƨ?ǟ^#Cn|rm[}umx` t/~xӹV6qG~ly.;?HfsvBQzabzB݌i. v =xDqY:D;#G#imt2II.6~R{q=PN671P3A7V?{sۥl[[!NE 3?`s~v6IZZZjjj.Ӭll<ֆX\fdYq,ҬKl- sp:7a_nWx3Q =x? D}b :Ga!Ԁj' ᲎;v,m%En?^\ZZTZVzҕ]tٻ%/Bޯg!Eﶨ\TzlFiӕgU/C T!ŵC\O2trA94a7YMq&:] q4bTXyPRFx1D. d /ea2Ib'8G8vh *d G̱/FbZ5c+ݓx1.I $1H ZQu-lxp52u@%o71z_6\j]&MTгؠ|o#)yݺuk+e֮["BH 8cڵ߃ʐs2.Beł7 6xJ<u٣N7$Ԉn=pa>P]_ͬ>nZefuzfu⍉{)8ex=݉Y6:iaf5);@h +8CS8 3i /xd=Eg“3A)s0i&RIcJP/Sꦸ 1mPr/Yw'tbO2Xn;eR{\|'N<|{U<rz>bm| ˶V?-É.kd:7=?9dN vɴN6>^LҬz'I#՟|Ŷ_)Cm,& 3(LLIY(-e?^ LUTj _+$mslpvY~ ]f16}4@Og^-ynGC9y:JCAJ)uɱ1o\ɫ২QA9y#b>I Tbbc\O}sS\G|sǎ9;-TݔK72k8S!=z8ߩ5Mnqm9UtqBcX >rr VZBn*8$ ,[rVTXb*rplXB+q V)DA6FJ2V[-&lsq\w94b艨%e6wV j2ݖIWG b%ƪUx׫px X FVǞ$ VnDYIzYaLQO(S8\jDWs7# Pҷ0m=p `J^3ɣblpk7R\ =HuA,)-KYIIYQQ drRJ"g]~*tKBm8KI)KJ.22O~(b6ykG5?#s?kNLb|f5|f4V?J|_uADa5.֐xɧJJtc¶֎W+*Rb(RPH([q EHK[ZqjbE5d(m.1GI e5PGQƂO-_Xt,"P7<ՊS F*YY'%%W(17OhJLHY1)>ydFT0ZomLrH9Eo<\tRU.ެ|iEʇK??x#S%N@0񈬵|yҖVm ߳pVYl)7 ˖y|meL߾Qn0/Ix%~!-]B$X)僥>\*dԇ.YdRم?XBMÇˬVf 1>x_x#K?[`a)LTĿ/)c|+.Z+"::h8p!N\Dpب" -\4"2M,E.hrE.zT!qՒ _$hÕZTKY4,7<`*Xy!cQ$}N$Zх$X姦p=ƩkW.Ngn_}%Vq$Pq꿅kb\&o`Ӊeߦ˩])Dko1#?UR_+IcUzj)T3+bGc]Cr[L[ןFcSg*Q1i%'*:Qq3!o#WX7~VVBbT*;ZǤ_{ EEZR IDAT__̕@ʊ[Dw'[+)'ngĨd 7p+Uz'yq"7+"b^.Ϩ=Z^VV.h˕+nu&h7*nX%**oYg ~$1IWr(_O7O_BʯS&ƭ_bRܬ^~t]f%>"PqUQq}y#bz8?*v+{ aÆ/?ޠϸ+4_- Fay>VYZz &E5a , #FMk7Qb˯_[^ %p9n1o^Q[{HbL@?|~]sKO/{d{ED7YY}QYQ۟5je]p$l;LvsʄĨر3% F[?Ǖww?x}Ւ?pR?씮=mM'O8T ]IyNHH2юH""p%7+-: _\ı'bGR^&!3kqk3eT ?\R2b\ZQvztdW\2XxR21+AhhRML>p4VЕ߱iPQqeǶBb=J*nI^1{ڕ\<q`:ؔ*|$=JH諨SXTKcܙW˺W޸2PRJXXR@ +A?\Uq\ 98nKvY=+iBîڱ (|Gp%݄+v~aWR**GF`qȑ#c#LM>_HqQ.oW/ver ',(#4jC,ڞ6'l;v4 F!fT_~}ĕv%+ r%=(;v`{o׏H4kdj1Iv 8yY|Y XSx6 譊rbJX[QQ'#*2.іbQv_)W3ڕRn܀K8`?qV,Yaos\8:(HJ|S8O ׏O4hi'Ynys󓵵PO1:r Npp+Y'1J^ ^&ʞ\\~KP(U8AEӊe$1NI,21N 31NW 31:|m]Xt=y[U'gd2QِΎv>c8ܿ8O6Pƍzo486a`!esqb ذ8l E4φu5C)6q\s&kgbf.X'hjFu6" u 4–`~vxx͋b7YPwI͸ ;ƞsS O&~Dy]3ʉ8ߌ: s*oP7pAm})9 7xX=ކUl9"8)/a8CxZ5l⽠mNsfsۉ7/Ø ܑxڇP59[TJa:PsUaHj >{5z5R3){J-Uz5g SRMЌjOmOȦVGWQwNԶ>MPXޞCPeP,5"5U:UmT.ْGgTi)& t2ud3mTj ř}2)i՚ F$W KTӌ Sd1l ;딆zz5 tIBԤa/ؒz۳L[blOp޶+n;vX9oSm3A۾e6ݔ;h;\!_wqv:25_Dj5sŜnngKJsYE1Yۚӗnh+Ɣngk0эuvIzҨQ&m꧝u.3`\;]1nflkhjpeQ.vqM(45OKɶ3+4ӥutp3qnG3l LxhtLKM QB~ts.һLty[^5h6]u7s;S>7Co \>tSk]Sț}Of?C.WK+#[V!ajh uY޽zz:rT]Cw7{wB!:I[" "*ë|Z+B9I}Q)GݬTX=hR t"N&WT..e%Eg3P<#=a*mp>jiQI}Gk.+ #)C<[n/(oW~MHFd4==J;rߟ։uW-ը@hs_[,HKﷁN:8y" *'ߢ@|rvH~uZku*5<c>G@o솟 2=_'<#orH$چG <4: Hc O+ Ocb>A3C&M<s<1>.yq{=`vs8<KXlN3H5qCR8\<!|xЈ83<y&6$Xوx*ϹS!DcPZXpQ3_rX |9]Cc9Ǜɵ9X{jFU"=b_yxsyxX=G0 xᩊxG 2u7pC G_qL\"Y61X*`KA ꉮNpH뽃 XUgwQM]iß5kVQVLik5s=9''& pѸZP Y]:~.:t:Ψrq`rgABg>D:쇐}>e'1 þMOW/LG/[]\`b+|oZ1 Q]\?o-ECAۀ^ނWu`[Z0 kJF!Gw#9bPFnr}q{7j:ZAhM[_nj׾ 4z%oO" (;`2[g;㤠Gt7@ 3NI9ZX1O`6p/*EjYvL3 0 w~[O'AQ^yT W '"I|iB#l7Q4IUYˣ)8&)2ZЪ-ڸq$IA!(Et9t|5*zjg)7G2-([ KdG!L\hrfCr?Kʶn:41Ll՗#)wk`{'$0?kC42bulTn:BZ!EB~lleʹ[lY.ILGӼe* eECp&>@e g](oZܿULw!V"MJ% nU9#ՙĭ^,4mO(1p2fJh:,QNA](˦*7N3_qJ>!Myi}vuiXRƞ#$dgIRtD@ID IWg<& %KIZ*N%6Gf/RAKIJt39wCJ87uDu5aE"tyj5t~Q0LRVg"Z:[/rSܬԿBj1Ц.U{%[N"j)ꓔTʽ MJ'[=rI,KQGĨ Nwa:ZEHҳwTH]-R%wK/SDNO'N"#x^o]da :[7I8$[$ rIϓ߃I:Bߑrzڭ8ykk"vY" pkrfx"( X51]4ѥon!g4~͡s%sWk=dӕ^6KHm!9a!!ҫIKlaKR'<'Q W 962~&ETY÷!=@C%'[Jkio c|1poe.' w1ddMd1jya2fY$`=SLiuWXd2a5c/k)& 9B61d2Pcp/" lNN=&XV=R4 In#]eY8܃  7.#`ш/bdMN8d}2 VE,A6=&zDXQO/54ޝU B &-ɂv0a&6l?j"z]3kz\vӐL{.[шT~h?gD# oD_:y ~5}Z 8 rq˧x3E] 6~4cll ycgXTǽ-q 8QuZ9Efs$1򡏍LnNry@bfDmEb*/$::$feLLKMjl\0TI,ʖtp@/Ups+kbӕn}صgI<76m+xI}L@gPa{ղi9y>w^~jZNWũ!JoD:'R[d)Zn>}|!RS%K2=djtݓG#SE+긷P=,&d@އ@+g}3-BBBTneOg:͆$Y ?3GQL\/cVD(JJApunWu)br9KU:>!+ E&eIKK Y+-mPiZ.kcC!fI>3`x83DQ> Wmt s! FsD GH˲e !~.KI[5:>G#JߟR~R\,{ItBp7-'W4,]jd Jz  d bo4,ʑHdM{ LVh1:)Rg5?K"= <;=$4'Dn9` -~ID/F\3ӑL H;P|/%$vJU7Sԇ"ZDL&I$AJOBh#+ԕ:R Bpp*r?O^$RL^K8l#S%Nfzf  mA+8S$'{z8m}7S uDGJ,gIj؊T`jŷ4$֝1$ND䀃ADPwTٽG% |4' :bIJ% OS ?UzZ[³Wn0S)98 O\6tΊV P_ʌ\la#MWMh|mƪ6Bje[A^xyXݚᶫհZmf띰ƾ|uY.Uk]g*gPcTroVp%kAuM`h͟2@Ǖn1-fF#r+F/^۶2S\-:Za봟X؋\c.+deDezF 3>k$L1H;B& x҄knj,ڌ,MoL#~e1 'ԛ][,|Āgà/^,*|Nd8\6:1JTWF- 1ƿW N,XF6iS90zuP͕4уpFv޼Āq ĤѠ޵`ɹ >+ߚ?$thީdE ϳ8 v|+p8\]Ѣ,7Ga?޺pG}ͻmp|ur{ԇT`厢~/0;Z y{N~g/+Kg"͛E8rkG m\8ϖ>]}?R-;nfGQ 4: {O+@Ze`;ac}igv"oEP HJJVgJ\nEМtRY!S "#!)#"Mjj~-.m#hX'&h.O*g;@p)% :-ST2_$ hT.^ Ќ#($-_S uq!I(7u~g@IQ*uhaaj"?Q@7 SK(E,UjOM0yvIХ\n(]_Ii2.V*ʖM ggسZb֥qi$!ؑ2u**~5́}X ᓵ }}:pT>2 Mmp b z'"-ZRKY3n1 IDAT%_dkIP.uHm/Iȥ0%N–7jiav`}*ᝯ(_2+z m|N)Y1RiC9'% ܮsc12l%[$OҪ4*็iRf<03`We۶$%B3,J{ԐooAZ6ʜErң&/_MJ~ ufpdx"?"E&JҒZAzd^T.l[] .% 1&LW~렃r&s8:(XG#],#5 apDJ`2C>*cĭ07}G P7}.6]WXR]j1$ο`kDt3k^ο8#DHW0l)Pö{B Ԅ@6\ߍeǘ^{&ǘ!L)[}0!"#ef)g_lQLSXOtM]6pejw{zAь&p ZƜ0\u;M/0:F#c6]+ ޡ#c2W 1 3b٩EÌZ.s/c4*c-zX fK̓u+2Yj"k;FƝ@zL&!CŇwQi"t1,v8eW [܉bf--ł`Xe˒AUOZRBԭ>;M5KD);+kHdˬ"$y|Y[r[rJt3 RdÒ*]r-; Ӕ"㇨V"U?Z`wLTIIؖXnvQ0[GrpfUɊ3Nj+ Gvov;R)Q8+o=q'Բ& J5.ez1.4OsafQ 7GZZbq, J(+ `\wM4d[!cqw8WLXq9[~'j4nU֯yyUp=j}4~]H28QPaHJ;;3n >vO^ʚ08]P`N^bKoE* WvGJ\jgە`{a'G&fɀ!V}xRXK/1,>_#KAB*fP{4vkEBZཱུtd7!u¿ɪ=ϟY2=UZړ<ӮA#܀Ѥ̄Ҽzrv Rn TNSٜ!6PdsV:wۃC*>Vg dˬ<Ѣ;+ɪuAOX1= 0ݲdT -Cq*;Q 4M&9ABQ|2B% ɳ@B;UDDy4ɋ#^|Ȧo@@ RtPa{Gt4O!xhدFQyJA{&blVd2-EhPosl"*=8R8( k:YaXOCvdઢ[Bw9¼@sǻܨ P^ ^u օ6=ug֢o&9~G~@ux`nĞ1{+3]TD&y&ƈnkV{⎝}l*VG4|8G)?d]g}K'Xo9Ï81g-cg 3MY̽C&WaAfghp4aM[f1#G`5Oޠ&od`5 X FV5!ֵe)†A^( l2Z[r Ꝉ L-CF3̱; zٗ_KYX vٽFdcP٧cJ_=#~Hl~b\~̨g1O{]````00 ``00 ``00 ``00 ``00 ``00 , , ``00 ``00 ``````00 qJZc00?sa00?4z0?ĸ& +ԎĂ& r\ w6a00  (NLbw>g{*yKCa"11 cdlq|*`<`LHRsW'cy^CRq }8qш>KtO Ə1Ο?``., , ``00 ``00 ``00X0c00 ``00 ``00 ``00 ``00 ``00 ,sby:9R0hqeX|re>>>>+/-߳%}WWTA%P_?Vzo W|^rw_nlԮZ `\q_gʊ}k|W)U仿r7 |Qr꿪/G(\ŸEl_PSn~{"rDݸqg{pϲ*mW˚Kw-o%}:[K/_Tz5 2-[̗-)bz]<[Sv`eX~AQgk= ^ Og>-;wښ}Kl{Jzy]5k._ds7 ?R(Q>Bx)Ҳ^K,^_2Z<(}OoM&Kl_dm/cfEk^-Z>7W5WYY^1w9…ZKk8j.(L(esŋ8n[!.LW6ixj&^d4Y\h7j4/,`,?[&[`^ c%…*@ ` EkzΞ7k@4olvW󫜿p)Ml>$KK,\Y?wٳ̛̝$ C}ʳg/(`b[0)+&dɼy˜gclHG)R:gֹ53gWgslx Rs\LnM&&2M^whdΜݬY2 gv!i |z/q3tރ2}Y|>`׾s4 `_i*1^9M[1t`~SSqZEJTXw6Mָ/ǩŇ'mI$ǣsĕt}%;:iAWr #pĸ~S=!a0^ͯA2,#L/e1 M@c.?+A%%ՎИlK|Aݯ=AR` KzY'6%y_YAMjL,}Z~[l٨2팺$?`'h_7S .H @gp\=:R]lhEg8bY}~K>8j߾ˊ8J_Nn?h+``pv @B X,h>b# c517RO>ʎa&u4^a<ЍeN7`0;`< _cfЫٌ0c,0Od0XS*l4 ̚.YMCf3+i <_̓ Z>NIѮa0^|=\N)u*b~Ɲ2` l8p z:϶wc,ݖU?]jo4:9m9db՟͙%4R]؁%:rjohnSр.?FN![azIj]`tMR b0~>0LF==f&Ę{Y8O?=8ՉLȴS1ѻ @7§|5A!,FV1Ia g :!6vh\1N#jP=Сw>buV`GC ^ƦvV5ƙ1}"j,`l#C-GWFjH@_^y cw=g>$gqvmb&xMꎞ)ܓi^d5{ȾS}ա#$Tx OqK;1?C l;j=ȡwh$Eydfٮ10gVɆc`WkfB HS&$95t1kQQ嵢z)PHT%2x*9 Ձ 뛰`|`#9\ӣJ`A'0J<|}0_JXLUrBB­׵9CVlZdEj6/wᩤȡ1jg9~LH5``Q(Ti\2vTr~ M5''$&l(w4L}*q] _IDATy_>"dDd ܮ᤬9hB״HjW'CyƸ-c? Z5|ZO8*A։$㳒3g]_m}A{߂할& *AftƪaӍgnCj^݁y hȠ$cvo[ښ.^jp~J0n }ӱ,Ijj^_1$%QǫWUDT`oi:]~g_?x=)']``g9Ÿ]-~b~k_l0Y&ix2thzҽ5O#8~f=xoRdӃOrk8]L0laqFbhot/z0;1/Ƴivi|T.X8~7U~jXmcd6k 9(^]5 ÍLwW loή`ɞIYT*{A[Dc5w~UeQa;a*p5M'[` ʕ7 bړ5\u;'>e Y_iK͓DUn53V0@G϶]tɲeK},[tr+ =`|PNݨz?CsrA6K{y0ִSOÍ=ي(k 4;+PE*J:avVv%bk2 C,J]K+ݽw2Fד8j,]LF$!mnff}cNٚPq:bwÕ˗nW&'PϨ# Ϭpɞ[mzn@ʺf@X) SaC2=..TPDy\ijN_#%񑒽mlۏ\mw Gї)ġ*X R>iI\^-+R >wJf Yj \h;Xl`,_rUؚK:7pzpeN~E]ɘr7jZםLmfܜf\ͼ iYuܭm U[-+nIWnfsaU`w GU! 5/4(X۾זyגknx-^vkgmytUYs@)V3m66tɾs+hOuiֱEѻkxz)vzɺA^޹82޽Yqqm%ƵsKV[h?s9ن=n32= 6}sb7 MgN74o|7߲ooww4ܜȲU{_77mӧOW gߠ 4mLKOGS76]8kjkhpƷmWn4ij:cU܄`Ɩ3~LS[!pksy.Z0gׂy̛;wѢyp ﺎ=O\a/,h>;^uUU??n;v? W,({*>WU5+h|lBGhZOn#& Txg[ę3̙ꫳ̅s`rΜlb 嶣p˥XKU;^ DNO otxΜ;{J;ÿ܍#s}<5by*>X|`Ѧ^ofL)nY{o= 3 X%M皞k|Q^!]Hx`?˃rˋP7'/~,LGY\G&#)& OX   Fw IENDB`feincms-1.7.4/docs/images/item_editor_properties.png000066400000000000000000001013651212255543400226430ustar00rootroot00000000000000PNG  IHDRcgAMA aPLTEٮϰǭ⾯ݽĮƯŸſݱڬ٦ݤ࠽۟՜Ҙϑ΋φʀɳԬտ́ˁwnverdsnvuwyy}}yxtkgd]V}P|H}EzCxCvBwAvAv@v@u?t;s8r5o4m7mKi_fzacrc`eOSbRSZNOQFRCPOAcUFqRB|. IDATxP>Lp2tJ,(R*a\EWpYzHV@!cY$1P* PV Ae<0'=}~Os A\CGǧ?rv4vtur=~xXI& ~'=fKקCtH@pۚ:::۫<"|˗._}IGgc(:~0abܽq#pvtZVg7p'ݝOw`'m;oVtm7{::b+NSt~Ύx0=ytlynΧMS N|ŇO\|hoyɥ=hvbfCl{ l+E=W@9< ɻۻwu l{ơ^j‰{._|pRKd2:(_}魛Oozn7ځڡB:ܻuo@ɹwҳo={V[7ۻܸэ`DZ-Hx7߿Gn޻s3*֮'+;\o;@ѝ;)m͇'D|w/@pT\Z8Jn^|Xp'Z]\/aoB"{S}|v]XdCٕܶ7n˾}|X܂\p>zyAPt9wN֬سywRϸLozz3+=+5αʾqý-zjz۩]w?I|r;5#==pœ)ү{-7i><|}>-3zō-=z+rou nwCqGPaV`̳h|x9-q''=+!;9AOZs1wܺ وS9g{RG<=WГFE'=8sZ|O歌gB[=d_ lw>4 7%lM4C>ܽu]Xʥ{V_Lr>x4[p kqn[RnMiY9gro$J˾iVlVD8Vqqӡ2+\g#n&vAu}ͬȬ['xu.Nmi h_h&ݞAćn= - Q{m'|}h$4aw*Dށ$CGg{[ͶGsZo=[ntɾ{Zxwۯުv7F;deߺsƃ;9폞;u=nVۙYw@+!+ލ]7;XG׍̌[3ZHox|,э{wvvŊ{;xqO]zt݃ǰw{ !Iۻ.t@Zey@{'s'tC_izytIw{ 7 xt<} m=]BiO<|cHzt@A*@ew獌lܽ. {ѐx0UO4ݿG8}рA=X(bCQ@!\@({X}Z!N5BtR ߿/n`Y]Տ3(]SEC[Ru<iRB`z&f{߿O0A@0'CI@0C[aaGƑcF X7^gn[K7!o~VG#C4Z #C!~ 1?~0b)D42ZhrEz 1 Oto(JTRp}qJ` l !(n?21sB*~ݱQEmvF =*Q;>%mD-}zK!dǒ/Wu!yWhϓͳ[o2W}^v~vb ip;z}FY (Gt3 kҏ%밙vy>8pṃ Nh>H~qI~~ ЩSO /.} `t~ )RD [?0_ :U&@)$")U , 80UBؿ(:tI)ЩJH,$ /IqSe CLC {}` 9SqTpXQTIi\2*!T/ //2 "T._RB?*,Li ;!N@pS%N:CŤ$bW ,-L;_/RT66[/)*UrHF\&*J!\"% ~ qүCƒJBʾ)+:uSC5`_$KJ kjpkI˔ jc P[&v!" Z4L$ ( CA{Xn)bU_6 Js%@`؁2qI<+3 6Aʋ[Ž|qi %%EjJם3| ZX#TbCE!1R5p+?p>9<}1jjejĂsŊi> BBATa@ (_ |n=CA؁R(1HYx/ b^PKhmX ЅbϋYC!0&L,PË<$%KxIM)OK!2e$ie ();X@iX9Ey |.> D$AzJ! JKC¤JJRЍrys* qqI LIP/JC>EZlJJ) ))cPA.G,Zq)8)!/i8q c!ҥ%ddYࣃq'$,ANZi)%RQ2tS_r $=,a $1u*9c>HJJJu0q?t{ )/cqam-.]T?б&Iah M|T«3aǣ𠒔tzF2G }KHGπė=b_ Al0(E._OВb%͇4LMM R3 n~ _C_ g@|DKfMv4 QQ" oBleeA߰=YK/~- A 6UW)ByyU +*_XiW*GCyulBl /_\;|ܘw)RgiTp7 @9ĖȪƊr-r)+zVӉ@vUTǔ44U`TдK9AYM9&ȷ94`baSvaqtބRWe*Զ7&#cjQӜWj-TI~U`W.42֫ ~/F^YZ!,r4E|<ÈǯSǥ"-&3~~Q~;b>h;z_\{K{t^VԁeSy4/*)ekAsRAAË }uMkxW{I~n {mA'̷$8\vuXT#*M,.hjCFNߞlƕuα+>ނTFDy ~Te*tC[l $R,Ny\JăN'4r` U͍#񁍂_ 9З pNW8U*!ԠWm./Oi԰ԅFit(‡ú½">}ga%7$ۣ iga҄`cS Xh+ QeʾmA5y-;SUY =P_@ktwBU]e[\Lbs >j_fz_{yZÔ_ /j/3d6$@mŘxD^^A*pvBGe`k f*ran=Y. a } ́P̢fl^i/{Ӑ^$*h˞3eӵgPHo_ H  AUG!-7(9]^X1l 3elء%{ve_*j37l(~y!E'msAqڦZlkmI36٤FJ3:CKxUv/s{ PCyƫUNxgr@6Sj|xfDU\v7BƢ//(A?Re\aU%4G T,6b5oYUyw iL~v h #@fd>P355oa[V@ESSd.I b>fX66֚#a:I.kF1H$Ո|EU8fEG|@d`TX[[YYXzk~ O5 '#M4F>P5ۆ.cүD;:{칳g~=wN,U{YYN,k_p"]>Q ܃PǏ#P3K4CkEs4 3!$%/%ot+}Wzy Da,nI/Xp(SS'GG 6u?8f߮,|Xg%åxr}}C1x`R ޅo ߃8kNi'-0kf"l@ `H!aRR^A%a(C|XXpӧO~'?65 ]xSwk(^uꃂ. :}|nBl[(U9pΞtHpBAaE1^#mhF.MFzFˣҙU\Mex!i~k Qi(L!jLzhr’xv?X j:a>L;៣Abz͛Zu&(a{_ TgMUk5m O?"lxb7]1lILLLOGZ'FZTf+mBAz?tzwZ[V*;^ۧ wxR^U?"ַmz44=}}Zwg=O~ͺhֽes9XhGV´N*. mo=ZZVKASDż\Mm|dp>foM M^YoptF*Xʩ䔣HJH>,B[G-j`*PfaK 3~wp[׮X[\peÝiYI?.op+u?o)64$dv!KOLb(Xu@sVPe394'(Jhiz WϠ> m ÚеFڲWm ڊQ]jcDvkE-׎lX|sp3.#K/:fl7Lf:a)qd>h;:ź 0 A-9ӍIǍ+o?Z(\]|'|Eӆ/l zO}Q`:J_JSpeTCVhV́<7 IDAT?W_-y~xCvCF}f/ *7uNC6/g㋠67kor-nkoױYIe8stI͇79-s9E%O9s& ͑ 3Z….\8ojÅ \4oV}k9>U髂sֆ4q7loodڛn^Rc7Ɔ4nɍdswYYYF|PouU5qZnZQ|̧9{EhoemNWLmnIf 値{!72דǍmk==IeYg`FEiD4G,/vXgE)K6unK?4R:l+/?L[j6 ғZ[ &&׏ [GGQณ`BxFlF#iLRY~S'Z#AmFD]GNb,'%kG>MÚ;X>LO. ^7I3VOZn3>H蒢 9َW,9o$KAekzJSUGǠQk|:‡/6 D+3׷Ʈ|K}xRۙV_>,O]{ț uY:yx>WX ;\, 4P1X773&Ui1,]|M8|`^ηWnf9>>(97YW_V];Tʇymhir8؛^Q[ۜ{m ߏL(oi<9vIXlYQkα t 1 n|`!\D DR~~ FAsbmfqnm_mSX"A=rhO76%j'{Sw['b@>F>BQE(~0JQC;#ؕ; cSdwMq: lWtlReyq{b{z% ~dL l͐=#i?n< ·p2m|8+#M%- q~"Q\$(BxRxd(;y7/.B>N{'3|Fh[ϏNIc{s}=y!:l>x_(іS7/FEr^ۼLQI{py~bgm ;oǛ $Y~¿)6pVcxr|Dq&h;Gnk_r1W#n?{;‰F 繚6~A;Œhw5R >*6@xbQC LU::C<@Ti!MG;UDLJ8fƲ! gƤ$$MF|b6#`2F``t9'ZZ h}Aړ=I@?INE@0!*9WGxQJO$@ԝ߷|N,Qϫ%fBAɺSmA|EbR0*znFQ~\-~RUZvʽʭWT4ÄŔ/²Xh`<~cag"E@ާ%i &#t/H{' >34rNnvl!$[[,6 Ql:aЁ (w? >LRGx8ikDCADΡ߅vSP"Q'oh0Ԍ݊v>|q>PjrVS޾Q;-kp Rpްu.bxꌒNigDÇ0p˱|/ Q-X§7K KImF7bҲr6bw۸&OϔXr>Bof=j8P>zsP Ky6[CfkrtB0:[E>31 Y,T=ĢZ&8(OG"j1ӹ=KV=1 ;sia>=ƁG.@೒3Hc>QPos@S8u>l񬪪s"|i@Qiˑi5U*6TQ*l\rtZSi6"98(mVh*oIeD9Br)i+tN '(6=os(̇WNÁaG!|nTu}nH5͉/O )︧L^9Ѣ⣲*^ B&AUc[QmLu@>3(Cjo),ͱS6ji)ƟgFifd_4@ѻvbߠ{7hV z|zYݴ)SR{%7oY񹀦93²gF0*TĚZ/>f]}M5jdkбò5msArUam{[tS5e!tcSGY(R0;qKK+mŭ+\?Wqp7Hhp"]+'u[QMAZݱf4&|l:XxP= n6A jh JS ! =!ZM1E~AU؁V,y4- 砡yp,b\z]Xv;Y՟?SB{"a僋0ع=lba5(XnhIc`oO}`Yl֖l(jL*,7صC gdmQMabشYfcXe''']dq߃5F|ʫ魚 *?cLFBpUYhς&B]FhwAȓa>RN}ywAV nh tD!G[y>jQI$_X(䅗;(m()s80,EMC'2>\4vrqqT l.X`OւQf$zHM>b2+W;!b/wePOAR\FwO NOuTAµ([Y iNk4V/00P3߱R~0Z@`!v@R`\ ,7dŮ#|(4*#Pôm~y~\tGŜV8,"SkxIas~Ue2!բC-^x:S,aB0.B3zH j}&s3s-L p-9Ѕg&E6+նk. t{,%U`s[.9ԇ-s~ˍ>_sLjkm3iY웾ȒiB^4\k<\ןd‡B~\#H%ɖ"erm߂AkV?x;6so=7-k#W?#i禵gmz+{O}d-͵nVUV">Xl|๩v@dȵW3Z?/`p8}ޜ*>W|u{Sk!G8lΰ^Q&5QzBv&&bAم 炮3bۿ8RM2N5*ji+ESU·=n.=`~ק|*M<-Yv,Yl6F*lFA`4 jZ-uRB?ܪ3=?T۔39Yx<('\CN!=nnn[E|h57;3v+ry7HජƆ޴>?an:z-5>)_(kSD#'\~ TAGa}۾s1Ÿmv&+_,78mdmZVN[m~Yf8,m,(ֶ`mic&]kw첱 |Xcp5 0+g*lDz0P@۟b^2>+g>ݲq[lݺfǕg[؊l]A[un"|ßl"5j,vaݰ};!V pl(p3|ܜx>{ߏ"b"|c@@=d8k-%|X5zj{&%\= lm1#'ga6v4ᶉ`K"#=>XX}I2z62H | t6~ID9~!E^G 1uc|Ii;wd)9K lxA1͍[uM^-\WJhNCFT46Vi:K"zJOm볐[8u6UvI>YtcI> vZ|pl;~>|)>Pӕ#m"_Z BOy.a6-[JD A%/&jJ[EHi'$ ${D~a5Gcc:Kn:̝Lxrd |;^-n|n_{iG{_ zjYk"_+]k_"ŋ_Z Ѕ9HBf>,PכPO)\L N;,O;JRN։?|d'"Oms9l>j ---d֧qnWӐs )_=+[]=z! ]ܧ= !'- vo|PU̴ȁ>ouϮ{՟7C|8qJg{4ũLWci䤃s9kS6նO:55O=="RHi ֧WɪKftGMM )7*.C Js[n-Zh`k? pٔxZIƧ7 'XRZکSsO@7a8vzr8Nvv4‡Û#>+rz#ܨOo0 ~6{^PlԐ"@_̆#mq g j.{}zqk] $_{xOÞ4KLpeffbFff&C2 v? >e(oSH;׍:,uP= 5sgr SPpYկ,_{pwnZBalAtaM^),];䋕}d{R33]v|k,? h`d~/>"g kw?2 "|}` & \l2X5?5ĂN,q>%͈I}/6s2X>>OJ;pt:F u3f#-M-;^f'ۥI A BW Mt̉MAvKpy`ھjAR Xv݄_L7}9\t=߬GM_C)96>S&|")ʬHcL|`2J7UeŴf՗fWgn|6!&ߛR}6]W j;/!&LSό[{ܜTM0@Q35PpUt{Ri_|,‡?>M>~ƣ>['Aw8y~c3Զ[zlu!>@@@@@@ޯ<>Lq>XhjiL"8A0@&~I$XY|7RD- W}.ܱ*IadΠ$KL6S SY ::6liL>(_/#F0=IV}||RjE0@! 3[ xֻ!Y^j&m,/azQwזuC_ÇR-Ee &tsBϙBe~GbC[{"r 5 S_4C:E @%Q҃R8(7 IDAT= ᕚ xXÇ2r&are)Jv%GBK*| WpB"J儧,}0a@'A>|L[x]/BTPi[ƨ9OWV :Aڿ30╗  &x@Bg2Sd^yU9+-[l]M_|UlAY2-*?)ØA_L>PF@0I@ޏ< i Fy-i H~ J'I kIb3Ug?i\JE@b!Txɞ6bk<y%BtP i({;P1>5N! ~ >P%ie [?5HSEWOݞ[6!=CiEi>m%O}O3P|PE(?;7:׫9>%]j7M+|9[N0 !+xy<+8\jW{>M+&:hh>L)[@0):okˆ£ v%vӑ\|YJRړ=B>ee&T$[PF *L 'RAej!CR +R |pQKEcPѼA 3{BaT3Gjzg@5z9IJ f~{‡qZ xyR`~-2j@&F(epg@{[ RQpb0SC"sXB0TբYttX?wxȟ>0J`LS _hfҹd՟uUߨ9W]iKm@%o_up=ErՀLe~dHWR8M pOBD{'Uu `܀ݻ} (mD.W Cyq1(nS)6$);0Ebݍ%AD3r2s4GMwM"Nj="z'GG#YeW=s%S1,/DN'ݓig<<<^ysIrr`|{RvJ͞+õOvdD!+gQ3(+/fOvW鹹C#y^vʮEr\ݵ6v{l3fw.E{pU<?^yv-&] SpNɋ |˷-|2]-NGqj: ^*NƾH1D6.7/;`ŅIy&'Ѽ0iWmFJ[^S94~3ϋ cehwOcM.j~Vp1ԑv4qEG(JLR8/˜s@+ec~'xp3&EyƸKK8?È0" X޶Hɛs OBr;bc"cw'31 -mH5 w#ȟ8#_cܽAUm$,ns$6n_t S>a__B/a7)FCYHbqSI ~8ώM^ Qvޑ+)~OlXDy(ȗˈ܍c"vǙǺ Of]T#Te6q␏+"ё7i+a8(VA1nG W>yGoy;P_ qtH1@XA.SKbNKDr \~p9\(s/wx2,W#$`&B/iJ$%[n?{Y龞.~r p}k+rv*&Ř2pF\KDeCӀ k 6*qwrpdA1*REtd㼢ydae؛'ust\fH1N[5ބ1;bMy%)ZɊ1>Q_ctyz:E+AӒGOTѱ8JpNɊqjv<.S\80p$)Mx FTt$(mH) zErd<^0|Jh~05xy87 ܽ~ _>/:a{//~PxbGQ> |؅.|0JѠ(c9~^tجbS>N `mB/!!`"݁!9qNyqv{Lpsp&B/F?v#*a.?asL ŏƏJS1E>q;b]c 8bMņ'E8Sg/ξ%e-WjRз׭PS74 -<ڰQQ,cCsU Mg,Rכged,fwh (׳@?CMe7TQW,ع?\V2)tPgL l8lv6RYLZyE*K6 uf]?f+kCdcҚb}3Vy} OZlp^:̷ؐFT N+ }?C]VOtA=[Ϸ,sg> #Sӱ0p;h@5SCF(+z,&30k~gF'갃z0'stYC'`q'BCzkjU_˯E_,D.vJ?; |v3T, @}4M&C|Z̀.ֆe,-8 ?!shSA(F8x~%YEa>R\ˏGGQYC>:;2/*I6*<5*ʕjiSޑvUIQM0>PHփk&Vo/tc&KrrǮ)<8&K$a|bM|c"({Gn{a<$߸X7~skB'#߈M?pV)r<]ywxBL/w<QC;zEoCƘh|Ngq&<&(6 *y^R_z~؅?!c/,a &-|d QS`rAA@@adv/ŇY[ASt?a{YbzV?7T,d+8R a/&C:Vx G?!5_WQa<ܘ,2䪹edc O(ؙzjEr 9DC6ǞNeA槝h|(2J{Dz뭷~&2յ*?9 P袋%M²pdX\D$bGrLb"ul˂xGL@W*LwOHӹcM3Myw,!O S 7خeýa%tMdQ"h~uhIw9 Ő4eh>j7\6SUN!9]Baf{{jzYrʥ! ŷˏv*& pb VO'vD]M;鏅3S aYG>(çC)L_ph avAϚ~d q±z 66Wܟ} m =:3\\.yך }`I5+pEOAx`ZL.*%P-<HJlPKBxghz*7FyLYT8y>ģ]2tCLD/-?L{3M]/DSeb@KUi8.( ڄ y)Fto,>N&b( nآR6u)T6hMk8pZie@UUo};Sب<Ѳ#֤0Yu!MVR)ʨV9ٗEWZt@wBQrk:֨ fqP.\2X"!^+U)0^cIV3 V1 ֤( \`dK6X"UN,cxZ< M|*tꁊu`8α*djQ&&qe>[ J)M+(B2bu T3WlZgN2-YV4@?XPf-6@ F |!`nx+|.[SzOi{Z4#`%nؽX?6I,ˋ)`g<5g *ץ55\ xez*jX{mz^6\T@/ |d|J.Mn$j`N͍AB}nMgo!c02~VZv&axpgίsу±k/~L?<կ/zfg+ \z/Ǫ{ # wk+= iT0ݾᅩ? e4x*otWj/Wl?\ʩ?IoLE@-SX?G9*碱N*?B;A#cW/5?Io?)@OӀ/ =5j ~>=rZ\ *Z$Cn[ttll Ux(@ 0s߆/^=$~==fPpUϿ۟ԝۥ85[mO ]<Yߣӏ@O-h=BZmYXU+OK7_X;xP''g=dB<,ݫ^gg9;Xؿ8v[ s;l7_0N77M=tHamIjҟsPznihK\?&t;|;BEH`rք}Hܟ-#'9RdGB[K7j9zH:0xJP`H2%[|ĥ kF<,B .# |b|ҕ||w.ŅA& Z_xU8i^zN@5>?AT8ə&Qܝa,ww"z75">^s1_;Q?3Q/j}tw Fy+>>=?xv裐־G؇[ȤĤy1}nд 9:y(i:ѮߞW~R Ga%,~|7v 0a@ӪuBz.<8ֳ>.|)<OH''!k_7+i7BWX6jGh :rFтpbu V|npO4-.nrA]!R2\[VՆ׈j )i!\U&ޟYOO.&x8"^!Q@W8x9(pgu岸8w'߇' ,7 && a'UI.s_~Q?5B,"R lfq`Ewixi u|IDATf ɱMea$w&XqK}~Xѐ}F,hẽ+8^N\y[zC@8ՂXͧG}4pr#hy=Q{b<*윷+Q~rS ʎFB܌?9CFZnP%ƣ>H> ;}wyC,T0q&2w@h+5mG\7,0\TЙ>y j+=缻dR(3bls5ևwoo%ioK,'敾&mڍ=K6Gڟٙ*)}x^V<p_fڌ.?+ӻ)uNoSR{)// f-͙8Mc"aijSSmS_JS[]UUfyɝC뷦hÒ_ߜ'8ܴcI$j*ugv;2K.0.gc\s\G"f-xo!J766"}0f"VKHî8ςf>Hjrx&|$w8vL-,#ч1^9cBx8pʉ rñ<;˱2 k31wB1`)[ Ȅ^($z)] We"'ƒ 0Wi Rhmr}!7I\)&NiRz ] 2ŧdI7z:W^l8kiE"ARLU(DGnR6 ivj VD,M(H[0/pjJmgszM(fԞbC:Bn*1@!VH8@!u6gl1h6SdNgd3+Vƒ.FB] p(}M3Ś4J!D!-*ԉ3_M*l#JM-ޮR5`e^mg+uRK"p.u16"H.@) {(7)b0VȬ*]'Ĉ£6eʦ4jPZRda=amEzA&C YJgM2,ixΒd jeZlb@)VBTetYsQ/HB"],D%PpwѠ]ڊM8 6EӍg^buTIt#ólTa| |6/gp^i`7(c~糖{[ƓX~8N3H5 R~_ _$=1X򅧈iȏ|^w A AMlal3v'oܩKĺMlbԖ)'+^ۆ!$_(L4„ x@B< !h壹!-qCr@P ҲP@T_ M 'P=Ox@0Ϩ+~=曋%}'aOnEA&.5u5m!}|vŤēϪ1YLy P,l +}ZQ8ʜ9@$iP;:kc~A@CA,H0R=y`.:Hݏ5nX;ǡU+Z1%ba {?BPe~8r aXK|J=fE֩F0Nj.boy 0+X1@P ɌBSB)J|^;2g5.#~7NBKg ;6&AbqC^8foԩn=XǺ|}H~ټ?<km~ݮO'Ϗvk<oxgV">>0sΝ1rcR[`gIy#h=8NNikxX~81:?:6>=|ݦ2e77y!l!PdPzQ#e legPhB3@x3Om<>>伝߸'pni7R`,]٤ʝ:WϑC.ç7010$`WQ!x #GG3$ $njF.,+ YC\¥ Ä}Q a½ӗO_فH5\/ܙ5e|"F04yEKqS?5 p.H slϢ?O9>3ޝ|1ʙ!-^L18N1NF#Ƌ~||xw0l"Ku *//`q>{ю\6¯F .0bvM*YX`~wH͆\v8#z]Pl/*^tܸpǻ(67p &܊`'9(ie K [!"@w#gd ]E\"ńm-1blkrMlzuٴ}v _l <)Dܼ-ֺzŜM;X>1J t:7"Vfm,"0<"kX3YVb:/Z1e:.狍:ӡmB #H:!ҝ)u03j(jNgcB[s ڿ*"I+K$6^В'u2;Fِ")=]Y^`&E-DtRYc!R@垱G5rK5`VYnqU p|Ȑ !Y6EzJ0%ي0Jѫe2ohJ J9Y 9SW](MFC0gF) C0L, aLE:G%YIN&!*vIL1'(DŽq̍ʃ6Dcn4!U)_y\|&Kpv?yITd5o7ٔ`=aBśUDd($TtYYDPIH+ ZFcYp6b#VӖ&?iQT"C6vlYbԡƱl4v .&pқ Ud ;@pd//6rd#bG'=Iͣ/FuK C䡿s4iCo"A GGoDs;%1>=2<×<TwʩENմ7Mzdl'/~8/rK,ړ:rs纓;CM\CWSh ȑ|dx}e:5<4vp*TlliW<ɑ/|b=Vc<*_pk"=g/¹@lvm@<|<*Jd\p߃;dlTe|y@ƚ؛p^sșI?<)pQC,-P7w.ٓu?/κ5Nus[<`ڹXP:NV<2޻0OLw{0B~DM6bYS7|xE+^٠:Z+~߫8p@d9Zdq"ܝ5r8cp@p'p"t#:|](6ߒm>%imWMkiΫET+9cxl->ϓ- [ǽPD!L%d{.%E"1Ѐi݀

}[GQ߱}.4@|㚸poclK{nqG@-jKbXR8t \ X22PaÊJ`(6,;MN \ˈqQ xf;d`TG0A|S9Y8DZ>eS5?Gj"!70S 6\`W4#ѭL3HS&lr0{ x@/|)xHP QX(4^=a`r~2o=;x5z"v,bS+穊$\V*1pG҂\¾m 8TէOfkÄy.pe7qo6A!._+0*=x$eareO{-zN^j8@zFU&DҏX;vn$ a'|ˬ/'şa#syBp犚KȍCoǹ\IX;~[[Ϸ*>ɂے],: eػ&lvr9 E`v21'g6DE~ D9uÜ&s76S~6c y8哚?E 7䡺 2F_ވhad?8JɜFì]}0R:2 im٪tW LĬhm>w|u1yXS^Z[QY{b}ummzh/T_638l|/"C[4 'ɓ,5_z-;ҢcbGF*g-Cţ/+|v`3៞E?>:~/ɱŹ1z.wZ ʣws~'9w<~ƛ{/#=z 8>B,qi%IHj9FX*{ZAyo;6K~Svc*Î "he'?J?zy1#vq,q=X<5in{AhƃlOppX\|l?%=O~u?zR2Ah}0ui׾"xxS_<}$:EAG?J{鳏6?abD~;vuW._ Q!MU-|Wl+Tb3E4s;WuYtB*[_ej2T`fB⎒ik0jȀmw >. Z{G.DE}2z_فC; + )%q ɺ s/9ۦIU\|0R:L}rЙRxud*jf Z{=+o^2Sх2>v+Wϋ˅tz}:0_ ɱU^ri%&rCZmlAW[z<}m:V_ 0hYjrrJocbvoKINړ- =;c'ӂL#Fg7i: L9~JS&Y&%$<Wص'6ex(&.vd cWJMڳTpδx̋qɕW/W\xJEeW.\z*,bÁșx $M5&FGMKLH˂۽Y.ٛpFM N%8~eԑ_~"rΜ=gM>-۽le?{  ii2f?c3iKLyȋ\ܙ]/o I26O˟L '>"gfv#ͦW:fՙ7AfӪM{brgP|",J\gMD&JuQ??9YI)H)alN¢* IDATxyTS߬o<.)V֢X{X(i)˳65595=9>O~ĸr#QAĘpL}ڬ=ƍ? OLDL61<5cƔjj|l?<6>uCScÏ&L*yÉP;!%Ʊ6͸OѨ*b%0F#샪-nby<`xO<|xvEzpz )C'O7';Q%ЀÓ?!OG& 0(q?(Ș9ql0udA ֞量]Oerb V3rj ^ߒ1Z3*51ᙀ5x z&A&&`؇$:&TǦ˻+aamS6( AV? eB;*#Ĥr7qƣbE0&~! 2cʨ~!DX iKiky_#L݅RnLNIO-3d1-R2WU[EUXkeأ鶌ߛ~(i)jiLVwTߛZ2:&[ǚG%L>Z?gxc?vOci8jӏ&~L C c7`,o߰wk&"`}j^@r;-6Dfl kdA:lI?Jn6 zlB~~~,k#3lj="97胬Y{eMMOMOMA'4nX{}SĆ+GEN<Bvn4JQ8z46=d[E0JzJ䢱܇cccSSkch _aczGz865Pccc &4?IkAcANJ0j^a5 O(G;y<4bf8NJch(@ n`ј" /b Q;/mg&N]τr$obv,OU/XvO4Oό.yn0O,? &G-/.~5===FM-/g[PVZ^kԢkjQjբk(/sD-jY!+3ˏXC#Zw-N+[G*v9i?aeeCjQLޣg7i_ߴifom}kٶb[mGmkFޝZ~pۛvGamǛo iV̏(ږ]U[:$uR&V@UI;%Q:mb攜{u"&rMvE-kFFF&U%-yUyUزؖG_\KIٕU 얪#_Ov~s?+!jfjh hV9rq8|+Wm`nU_-jY^^#H|R+%p\gÿgbΖdGT(qfe.1Es$r($eyyDO$ 6}B#p@@ H`Ό[`3ï-$&3M;{eym6 A^4x]MB;5/I݊@t3ꓩYjQj䵋kKֳ[-jyF^UZT#:T-*Cէ@-jԢfM-UY7.Z/=$kxi5ӧARSO y5IF-dσm5ˆu^r^C}'K&BlC8zC!fPF = - M 5YzX8]xmz$LBTf5k܄ft=I[ t&RFe/QHwuMwOwgzonu/@fE<a 3'` ւQnߔOo $xЀ\~kWs@^ &, eb)R\r$Yx咣7IL랼Y[ݫؠu+Yb'$v]I(d/$gc'v^I?Uv[vRZRA\ZI7=)\`ݷW// 4My>[,MeIdQ<˛Pی;u`R[T{uB E_7(͇2INHrhFC/ΨJ۔ EM$d.!Lwա3ٰ]kƋ}dX!$Gx3| kvf](jmd$Gdk~)D$tP^ aC3)꫺AS07!N=!rw"7"NJ IOc&%%~$Qb t29l%,@Bv|H$ɤ;ڛa*Q`2y9I>~I~\6$&r>ɇ9H^ RPxX;Tly~M ~c(8/> Hf ?﹁uwfB{.n6k͊&8Y Qb 9؏e;bS$p9.58_Y$f;+>sl& feP_3R71WَB|;3Ui؛BAaa5E+I|>?Z6d5J mZ;CV6c_#t!GO5XzoHUΛ ` Hʈ0Qln>AR{C↯ «,ԢW^.U"""9Yhx)- ftR-92J>e5kJtA~>D}@KBŬׂЛ>THXGf?!c,BV0/gYnPfAJ~fG*8z=[Kn)Fa7Gm7 dc3ssBcrfM&\C'k-|.dά=y>rChSdIlCn)r/lL@LZ%r/'[-kq@O ڄDڔ[\T|d^nxY)X5H Ie- ؄&,M3!c{Ho_zjYxKЎ<{_d,kFhξT3doHظ]mL%Y&9>x}ό} e[ZRRXXRR\XTXRWXWTW\d ֮Ҥ܈0qldqYDĤ|ҘfT6R+dҊA㿾b:d;b~WiIiSP+-y8#r`gH. #GnX"A{4 qOt,M I'-Q)Rk墋FF5ÀF`{YO7%,>z.GMs^d[.f𚥕oe-{1y;^SKbp4cWfXa*|o ߍz㺼26ʷn1N\Xx,i\;wa>y,^U;Ƙlx)pm@V/[1cΌyXolfdyDSm2c416~9P$K&˽||+4~8,2{̈W~^/*r'b ^2ft3_k@_@_lM6=!56VU+OXOqp+3sl͍yPl=؈0ߏ_2H:4i@y!!C }/dgz ~$޳%_}ժvVۖoicTk)RLd~ͦNH0fV-|L}ם H7f #n6z2j@,kY{48B3HLNM `fq5m`݊ 4 L;(`Y~ROFH+XPO*V(X;|ӸL55(88GL3csiNq!h߷g9"܆TX T!>i2EPͥ,ڥ)!iMkjT26;)d`)j7ݫZ''- FE8!C.o0xebaU2cYl@GT#z'O2t5 ӿ.1CO$ej m TkR&$`+P[sB9Y8i1/1uj3 "lǑ$2E"hIrsA"=<뇯;C$yʁHKoND֤OՇu .;6=gאWl odoƃV#~LBW㔏Lz2dh=Iόt;x )H%ܮZt4Go?o7N5wck,. 5\'͏Řf'W,` REDidMUȾia ܔݔ5P45^ Dfkiu%غ뒬\\6Cִ@ĩ~ EHӳ7%Nt@^crq'Rao$9@fH}³s$G;EكeejR IDAT:@_ˍ0%fՍ`DSQiN ĜU"0{wBz!"r HfmSQ0QKRǛR;]C}7`r FAm[H}w@H@T9P,'6+K$=,n ^w6Yl~c`0:JK=PCHڇ{֮Ѭ&vY`K~"浍|:!"yFm..I`Srs麼[ªouBhoRБ30*-JaK h`9xGsX8ia_{qVX+ V$t -^7 :N+Yb7T/Rj*-'u Ȋ^B_?B4ַh*+VK:%nC_uIp`7SC'S*uSPW ,D G s5{P(M4cJT<9\y@FV9Xz]/J{dLuJ뺥 K2Rd0Ճ#\֍얡X72V)e_W%x,>_ldnhl^Bao%f?)l=3  ܘX]0L$i.'fSh6lؽmdkhl`ɎHDs(aɐlaofd9{K6I̺*6k'$~cö׻y_' FCyЬȝƘ0 2a3L,r7dhzI,{LCfnVL(w%.fwsʐEF|nPNCc0xIF$D^YoMKߖo6ՔmiMȊ406'j&:e O~?! 1+m#U^;o̍m4& XeL}x߿'[91f}`V]3 n;̡@`oFA60&`0o!&sEE35ÿmc6-D3cp#}sclw[k# V2nJw@&̌ool5U>j;`; H3Ƞ2imjBέI?YkW*?/l5vFaML`xc-o >xkLx Kl9ʏOn֌--H[޵07 V斖VVVbų[lhwΒ-P>,Y#,1%Fٛ&9;=,as\hpZ4j6- ̟ocP?P(7ةHu2HbD)d婳R^ >Td^ gyFcD͵& EFͭ.BYb‚Xay)uB)b`fXCȊiP󀬥ҹ}g^5kE\ʋ݀v.5S/*g Bq0SY1t1CU tRRl_9k19qhngL?x3v}ar?xJ|0NN;ǵK̊ס?x nM\ڭ-S_41g]_}@5{{_X\W臞:}G'5y:pcY92xby}=y{_x0|||<։"1Ɗ-L9?c^| 0ޫG5!ۋ1sɔNJsan+įd͏ ӏּAY5gg/\,)BQ:̃r鳰1=VsbV D uܙ6@ylVl3~aٙFsFA.TWgggىJru]6^XS;H=} w:yPitՍAwz5/:JhgJ^ip>L#~Ć31njG^4d(h`ySD3pű(DgBa\{v7)7*T kk^6U+dƠGĜO&:]c#w֞>5L~͝F?N ѢΆeXN+<8Dt`;>rtQ5k c Dr-AT/?uCT SBQnj1h?t?9XktС*Aa8:vp+ɢ^`&|95;iw!;9/Ӂ羈5޴l{KbّǏcN7]BCbfe*}@:}ѣ57LV1LJW\ioko3z+NK{Zc⯁YDUkq#BŎ##z ubU<'5iS.^^60—0-O>/ZFwJq / H6H׊ Fbb]4bm%d\1JusҸvd7ZktjϿg?sJ* <6 kbmOhsG[hAhA6VGAѝc^*f)?{1֎;%)Cck!b> \()-C)wN^iOc}0`KR6]X#+5t8ikۉLΣ!bb;^ KxiX;<Pd5w˜kQb81s}QӟuSZR֘ˌwY㱡ݖCѣ 5nw k*f'iw\e:9Yޔ{(>6_+JXCz汗k)Pd. *ECaz-g Q6ysyoY^Г63_^6筦4sc'$K5z8|-N4Zp҆b9髱Fv4Iu:3K+t9aOYg`-0[/kn̚Ve shiGRȉr4 a+뽛ylƱ,GxyFP>F KȎ}haWA\#x8yyro_xCogNZ# ̏{X Ye25n@.֨9>/H2_eAwp?v>4O{)~_ZpiA=s#n^nޮtƪ}j6XzYr'Pmm9ikFpÕ_J`o9/P5O7Xx܎SR a<.t/qJtrBziRw[;x:Pl}\X<: ӃF[Rhtճv0;+33X.+7ﯼݼ_xxz{+15wNfff%LKoon}аEc^_lzn0(/ch10ؾ9']0|s{f-Ye}mczvO+U¨naQX"Tا =u@Y@g`z*QWnQ)Wk5 c׫<7@QIEDidyH`YG!)OUԏ +͓ݍpeFRM#_^knkK澱D`6+y<Es<֐2_g:cDy{^kIC%7%у}hm*P \Au'up̚Uwẘe1y7k8EsO6 z8llfa7VGuAyҼ}LP`~5Q5H딌OR3NkdIj$AvBDAC(>95סl,mDhkl,23߫L|NZJ_=$Qǧ}lbq~7H:La3OYƆoKzoz}?k絿fX"͠7XI~\\$D@'XXuV wg  {n p[=z:oVc2ZU8_=| 0ӹo~ {hҚ 6| %ւEQCGjvj8jvFީmpWT501<z b]gf-oWS}~k'bKA![@h2o鐶 (r+`mmo:(5ئfrUd2}z[@IQiijsm+xP1UnPD5/81Xx,&-T h'pN G:k'u3=$$N**/^ICCx#YltOp5pRe%&]+$ZUsqLSQ1-P[Y;W 2a r̖’9/4U48ⴖkTFPl|իWfb^ڪX+imjeu6톂܊^hlUkO<kCGLGh燈!M84dJ30pēL͚kO8e @M{;t%6@Sp{cHn2naBG%ɝ`̿nخJ|Vu+(ր!\ @-%k 2^!|kΜ|(uo#ZJz-V$%h4MX6i,2zK'mݲѦQ'啲pqik :yf_^X\d'/+n Isf3T~[@O RuhDSA\sv$X6w9^H=$Mn C F׋{)F~SH&_U7lv ΕbzxN'lϹo_z5\{6|ي*U5$x k=TkfbV6pJ)L˯TV~(%fH/ZꬁݗqAkgph JӥlgF\&7],vZ|ֺY#l&6)eNߴCp>3Sg&FM&Xk8`t {pX 7آhs{CK`a?ӟg]}m``Yj6L h$+v& +\~EJ[č4B#xj]Ԅ٨q9xKguQVYyP~kEcx~ ͯE/54gdhD_Ӛ7HEсgEGGIKfB:*366bxx#k(F4Tx[*΅Ԙ چ56^# }3Zz|m>8kKH<zeC^aSXn'b|WÕJsy1\^:8">wz2S]=)Ug8qsnΟDKƠGyPYyyt]>^t`^^gϛ̈]F_a)+_[s|hJlbd_rv&Җ>ZAc0y8=藮dAˉ^+$q8ՊU* /s=‘#)[&>NbaK/vz,a+:|'5O.e%T|tЩ(w^ppg{eڃcYNw/G =J,y](gW 4U94:Ҽ))w]kij-rtί(ͅ1.Z`g@d&R헵S+o5Ϩ5zt[czjo5mi#X;ۢZ[W9fb8>+֡ b_СP| M:YsJ+'H[>.1oyzD=ru 7v:n% ]C<^^wA1D;YO=qT6_\y;Pܮ;1$I`6C6m>ϣSFd)rS^šp^j9D.s:k>ǔ9);6˚ϘM,\G?uƚm;oi*;9g36ԢXIQAĜֶ['2F˰ Ë˯qVc+77ww:(@ ġN#Aofu]U^KĺƑsfYCY}Td}|G*;ƚyJΩEz Uõ†c<%XfT(w*k1|I(f9e̶<}_X^@ChVjXfճ6h--QL#n'Xtꅼ3>t7b<3LRW֣VDS{'-͌e捣EEemDz}T!!(PЪ6c1X}7)Y|tvS^mNwRK-%3A f+hWV6qK5x.'fIgy̓|s҆y鏒Ql?M;|Q&zWR^[ $T4Sk;Q^#imDX;9JlʏͲ6g0:E\7 {U;EN7ׅ z1^簉-+Ոw5ż_WYw`ae*0 TVC=C˰TQjTRtxFeC*ƕkZ *6:~];%ΰ60"=Xan'V& $yҁdinXTY+6% uE eYcs lޜM, ݮw3Z*Z4ķojn. o9-#UY8<6i'ȋ19ښYd/wI7^YM,XW@bYn̙|v0/̍ _ֲ'X#Kd=7{tF 3UAZ00٧Z8AZ}̃qeKcz1ܮc|C=3ہBQf?tFΩὮM:AQ{eÂdcKAlr{AOG_3`΍j͕ Y hacrjPcXM`` y c$ l&. 1w2V01&t a̋ƼQX"$ 4kJ ClX8P kRd[⽀OB%)"0g9Y5 &cI"a*Y2_ճ6ttHju[^MjfigT+=7P>bN)avM,72`voZgCy'b,b9kĠ~GE kKf%[5?_>IefiqږlcW&ωe%;֔)l}A h6klKc ] ~gs #y~~Loיo}#7yw%wCZX?tMxlZVt]yn\hNZy-_ںȯ8.2loU3?t XnγӤ<<hebq;LEό)1ӄ3ah=e&~0ah~4 sF;m0ᫌ]yC:oY2ZEaVNA^SWa1?UmK$L2R4on_whZT0+Ν;iXǀ{CKLseȠiMr?227cp9Ww X ϩFULpe04QI)Ny8< ⯙&>&)yφ#wi'ґ(ī%&bchwg}jBmV0tYX6%Ao)C~O%J[P iװi~,nqhrЖ`p[Z$PopU 9@=]j_gbusLaFWGV@[Pӄgǯ1yBvX~ gTɆ:dl?z3W;ӂ^fb =uwLM.9֒MdӢ5Q#୬h\y%} ifbZ Rԓr"6jM6gB0sR xJSȝ%iue~} 4q@OXɩPD) ,׷ pjp%geh4@ \@"h4I Evei5TYkp|&6Ig2,s0qvkOӱܸ%` 7ߎU̥ ,bJp86L4G 0u>Xd5qU淛s H9ى~KJ?;egc?GY.5DXfbh֊AЯ8FlF)W!kP\D"\ĂOѩ(𦘫o^:Ģ[_h[3n$fj˳슊4vYE~@V9_qU\SJ=8Ċ$Xv1U.6X1o,L[\?[X7RkŬNQT#heZ_S UWj.*srE;V)Z7=6rN3ieoBAϰ0n$J5 #S4b^;~LKwΧtR菉qϧ9 SЙwP?Z-Y_IkX~SWTJaekn\wp\Ll}ᢘ\vǀ'](9JYɭrlY0G_~e2M׶ l1)[o򦶊GL,L,k{~~Ώzp\d_8{1͙Xk/~3 iL,L,8'(bߡCdb9 Ų0}С@ayW66201  Fd-ӣ,yT;IJ,Gz@S]˵jW2gA g˺l(s֬g ؐy I!C2Py{HMvt>(ؐ ]{gX(VZZ{ yi5n{%j aCii X(d 'xH$ N|NP v׸I& MDy+uX])u̻_ ѳnnxNX%HEkk( p?뭭uŭM%tXͅŭͭ!ֳnE"`6k%oȂ=RV/\Usʥw/u 7 B@RQEWd~Q7omCX Y+=ռГӿLF<[) G.%W?R_AoK l3^veT~2**'d{@flOPdIkݥky@欂{Lt /wwHC2U&FGG@WK0>mzQuqJWxS__G жo>r/s߿e簬 ,eJ=+ܯaJs{GGfΎ?XXOZ 2kn&̨>.W, eb!2g?&L,jz.o5ݣ3kXWc{gj>Uϟ>4E!6hMZ:[WXBU:J<^vP;T p綶*6X@F$bTtQ,($r([#**bl 04{ZS܇/6JgFI_6AFn̖^\Jɘ]4,+(j7`E6EnWun@UO:LʼnNXx:[cYX.lݓuL, ~U5DUuZwjEcX/3Zo?Ă}`YkKL_O-MvNfjr\M#'ND#d ,F^wdJ`{̌gZa_vPjm{ٮjMe ڈ.՚bO]Nē*T؅}ei7gFo-%dab=_4G<FMNlCL:Ϋ?ûݽ.dtwȇF[Z5{f]j&VGxe[>_;n&G@O<:xi _! .g5ř.ZVjZАA>xjd&RN/k= }mHe fb*$bZC4E4̽Z.#eb!qO\95;_[FVxQd%Mij(e`]۠Z 9rfոS%JA~S]$)0=$dn$  -X}!l xavP(|B*zez5 Ph4ZZ!LASzO>Q9<4}Ŵ0KPdOcjPV#hKbbY01j($aO2>w[L,L,=TEn]v8L, a#V&bv(mapu4Ldec3ғIe'^97e=,˳_`0K\XsLP̯WSRY|EUZ?sIn59FƴdSP>nQq%7 Yr)x)¯]#cWRcT NrbA T9< J|=>FHǼ +ʈL%A4ڕ8[Z%ā-0o->! /טLfBBLsiBMbh- w]d)>kn9^T(I$%]teRq=ZcGe 6BF?P2mwƤu-'abqf&7GFSoܠ0"X-dE~ł|,{[Z;i2D@BN֣:MUUo͚ FA.MD[L,^]'GIuKlVd&45Qo_Ģ{27iLsuO%'}J#\kL&07+5.5z]{+~-^9zgq.II6ߜ@Npn40}a귚$;LX"yY'X4ʣ9|';4e2Wt]&}a}e hf8xrl4g05w+t}56cBѤ,,_fb)e0kkYfP^`M^։ͪ58Nz);- Lc-ZIFz$XJoen1 #*scLqb{L,TICq„'f#wNL@LSW˦Ly95nj4?>Tj~T/_5O404?Xˍ2%?hq~}ZREyb3*=2l>1 5\j>y/CvEkA%=KkXO>a4t6y<)+҈L%!DX4v~bO>6t I10c y֯"^CϺQȿbbW~ L,YWOZaL _<0?Ie[kD 2C*s`d`ni-AmX25gG1]D,zeB:"[XrgX4*gdh̜}:>a/z6fRO'`ԯZy#װjüS4$} }>}[ab-@UXbb FBUZ+4c 4Mű՟-i,Z,3lDBqhen]k'=JdbƞhLW8 MG ‘IpP[< =cvbA+pƤ^*p1 PK@ˠ7Z/OLD+|bmH+8شfظy-j X4waxBɪ=-d%[h >&<4:IftK%BUT2X& 6iL* h+>ϰ_+OHi^q3abaA m3Lxa@q8&3>8[ "k| bܐ)"SQȮEmV8~`bQ+$OP|͸ 67y^[jf?OiqX;Gńp1X@~ 0/w\`XA[?ƾ,-C?Oݴh ^MFPƲE'RAZsZ,6v0mUfZpk*^}HzTٱRKj#y>#~%p߮ë){_|1EXĻW pc}Z,0 ;K L_s=]X<ȿWxqj.XmxAu7>1Q3/zd0t\VOuzs꯲=VbY} yP!KӶu of8]!77r[9f{r_gs^P>?zt/ȟ?Sxƀ pR@ "vfÿ:^+c;cygg g3Ɵ*}f;+oW&}f? ]fњ}& UH22jCn p;Ey!m@G8>/xI[ʣZɋB탖P0\ A,L#aiU<*ʾz^قtyMjtf\+oZUF'T_V.jxk@5L tu.3>춞涜GeY4fM2?ar-CS{&ԹzUk5;yNg6NF[Ѫj ~V~# 8<( [M-}e=Xdu3 kGۉ,C7v:eN32;՗V6fѬ_94.@,86+ gm3rk뢐%M>MEj`n[_!WPÙS)Ǽ,P|g{??i?r_Wx}|"PCFE< G/{? 8nje\BT&GNLikcGu4Zmܷt3垜bXC=SZ4rWYTX. uyw,@X'+qUc1E<0>Euͪ%&?OPza_0G_"%p%;=%-=--%= AJ*gogN4'^5[Z=2{<cw^[ |qz(3!2LM[z+Hkr@<k^uxPS=3Ɵ5mWLNutfkX{GMu?fժ.hMN9EUx%0xTb=_fXC=,/Cl8/2n9l wn^xk c}BĮ5Hf oXcHwhNG*TvXiq.iGfs1]Tmu|TIc&QQ~Y5DL,do1l3y J5LJ*S\&V_S=_,2YT kfE[m=8EXa@ ՃQZHniͫBh()VL3aOt~1BpC6N5baq>{L,uGGs?5OL7OJ֖2wk'k]IjCkJ|0qfabIL` Sp[B|R+ XM=U]ZRfOkݵ:sdhҬyvͯade2}&{(o:>}'&X%bs2:\ټlL,HnG-#Q=ګUK֮8Tz{|H+move[EnRZfs =/pXOep&_߃oQ6|EkrR aNP)ފu `2g t mCL,M=$Ek:bb9ώy4ޛ@,ae¤L5z-& v.öΊDY]k h\voi25G4ȃۉ:!  允V" |y67@a,y kk -F@:IJh-տOkRVls&a<<*_c^y`>,Aw̻e`XUCLڙ7NS9S;I>eom$op<v_kENcbb] ~{gZ^ uP_گ5֒Sd&LUTf|G BL7=R/;\8Kb̼t=KZcbLA̮26m=a󓠙 3+)ɲ1a=vkd8+z1.k`zQX1 'łvlk :q4s Қ\UfN#jдP6[0 -1p 2EUk [hzRXx/f+=r=θbcwƯ4* =Tk Mh2aL1h_\8\aāZg2D,P*Fep8 @ 2p.@1XLOտzM2$2K꧇JX&ljJ91l36fb _{}GdebYNfbР)h[~-FxgPYuIJe G%9yNhV\^ L,Xkh<gyY4ϾP"Wx0uPZ ў֎wE 4=XyZ kM22iWk1q%ŅEl耩!I5=DF^51»z a?L,0fbZZW1z8#őAm`b-?HXXWgpחo_RoR6?vGKL,!m{@zUrO*ڢ2֘[#05-Q+EA=N3ף}a] cL'g?bBjXƙک3)f&D&lTˇcCAfSB;FgT|p+[L,]{`ǒ_XaP ~eh$1^ O Mv2!'L`r WV)SScnDt &C\ Tm v<ە:]}>,_xe(1h9%Z"F>X^Dv +W hTBS!qE{ /( q8.00.8-^,ј<-p6 4\aa4 WTfe.'bȸy~)'ݚʐ9/Viaa r^VL, IB4f 6tl G_D]& l@)h+X^FOaڋy :@L"!NZL`^`eJcЋFu)tBMRiD iيQHZJgAC[LoB|c2l`Q9}16;%.@cm_#Ȏr8+k1q0 L88,uZS:&r&DaZJNVĺ 6X%J~W±':UC%*labYKז]Z#nR?[r4`3ߤ3>?N?JKbifb-q7̕}T+QŮgbo&ݞ:kޭH-\, ̒T~N[X)jE:|q O-'ИԻ_Z}'2ȡoZ{˘mmR wk xVsX);p-=z$ьXɃXUi3pNlx?8pʜew'prD*͋w;5掌}4xLV^X|KV*M݉{-%l]mBr,`vΥle# GBmٷ*ʳBl^SXʿ[65hn,69%+\IZC9ڲPA)B "=xP6kkXj ܦP_KNMf'ּ{? l#AOЗ0=jis  8Q@?(+2eUE'~͝O%}h(`p{懖IeWYz ށ/ B<7 X?/}Q '!'IXigYPMb.ͤTklnVʗmȾxO'hò;'|h31C< Gz?fZx|9%S6xBV 3IDAT~f;0Dݿ' 85sl9_S_ UdM8P׼S\{Xϑ_Y=bb 3bSƲL@.e'-9E\`JPme8T1pw4ċ}>T$gXgS};C㤡ɂ0feǨ3&|iK)4<!Z8PQ_˪LJ*]6(׼W'QapXI**aIIegggl5P~MpZ{Y[vּٳ+'cPL=pr: 3 F 5Ev<hV52k^kKgL,GFv=jAwU 'z;'F5iVYU0|sǚ8*L,R*CZ^]Ē>yfxk?6 WTS/Ic@BkQ>-Dޯ-D>()D6@5b>t+s[oOk2]Cy<2؏y,GջCX~4Z5jQ@"TH%}=?}ڟ R,Ā7}ɒ~HfkqDZJ%ggqӳw~C' o$gr%߀U)ܿw=߅_[_Vz*;f1+o{NmDmUFƀ+*rKDe%+9߳v@kƯPwZ35Z/d|a1S|@۳Xn],?#dZe0_쟲m=i e@}RTX)ʳrahOk{Z%dbqAENV-&AiiV"=s֒V/6{?/+yOk{bR߉hH</ B!=}^}xO a0ԞVNJ=ڡC^{3ᷡ5=u j=񷠵çμϼ yٳ?}Z;k1~~|%K 6u&~&oM|K^a?ZJjioކְK+XM>N6b{?yּr[=ڞlOk{5{lu>rgXv6` {t_{dzZCede/S?!{K=ۡ=goͯٞimg{FUxIENDB`feincms-1.7.4/docs/index.rst000066400000000000000000000042261212255543400157470ustar00rootroot00000000000000.. _index: ======================================== FeinCMS - An extensible Django-based CMS ======================================== .. image:: images/tree_editor.png FeinCMS is an extremely stupid content management system. It knows nothing about content -- just enough to create an admin interface for your own page content types. It lets you reorder page content blocks using a drag-drop interface, and you can add as many content blocks to a region (f.e. the sidebar, the main content region or something else which I haven't thought of yet). It provides helper functions, which provide ordered lists of page content blocks. That's all. Adding your own content types is extremely easy. Do you like textile that much, that you'd rather die than using a rich text editor? Then add the following code to your project, and you can go on using the CMS without being forced to use whatever the developers deemed best:: from feincms.module.page.models import Page from django.contrib.markup.templatetags.markup import textile from django.db import models class TextilePageContent(models.Model): content = models.TextField() class Meta: abstract = True def render(self, **kwargs): return textile(self.content) Page.create_content_type(TextilePageContent) That's it. Only ten lines of code for your own page content type. Contents ======== .. toctree:: :maxdepth: 3 installation page contenttypes extensions admin integration medialibrary templatetags migrations versioning advanced/index faq contributing deprecation API Documentation ================= .. toctree:: :maxdepth: 3 api/core api/admin api/page api/medialibrary api/blog api/contenttypes api/contextprocessors api/contrib api/settings api/shortcuts api/templatetags api/translations api/utils api/views api/commands Releases ======== .. toctree:: :maxdepth: 1 releases/1.7 releases/1.6 releases/1.5 releases/1.4 releases/1.3 releases/1.2 Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` feincms-1.7.4/docs/installation.rst000066400000000000000000000057241212255543400173450ustar00rootroot00000000000000.. _installation: ========================= Installation instructions ========================= Installation ============ This document describes the steps needed to get FeinCMS up and running. FeinCMS is based on Django, so you need a working Django_ installation first. The minimum support version of Django_ is the 1.4 line of releases. You can download a stable release of FeinCMS using ``pip``:: $ pip install feincms Pip will install feincms and its dependencies. It will however not install documentation, tests or the example project which comes with the development version, which you can download using the Git_ version control system:: $ git clone git://github.com/feincms/feincms.git Feincms, some content types or cleaning modules are dependent on the following apps, which are installed when using pip: lxml_, feedparser_, PIL_, django-mptt_ and BeautifulSoup_. However, django-tagging_ is not installed because the blog module that uses it is merely a proof of concept. If you are looking to implement a blog, check out elephantblog_. You will also need a Javascript WYSIWYG editor of your choice (Not included). TinyMCE_ works out of the box and is recommended. .. _Django: http://www.djangoproject.com/ .. _Git: http://git-scm.com/ .. _Subversion: http://subversion.tigris.org/ .. _django-mptt: http://github.com/django-mptt/django-mptt/ .. _django-tagging: http://code.google.com/p/django-tagging/ .. _lxml: http://codespeak.net/lxml/ .. _feedparser: http://www.feedparser.org/ .. _PIL: http://www.pythonware.com/products/pil/ .. _BeautifulSoup: http://pypi.python.org/pypi/BeautifulSoup/3.2.1 .. _elephantblog: http://github.com/feincms/feincms-elephantblog .. _TinyMCE: http://www.tinymce.com/ .. _CKEditor: http://ckeditor.com/ Configuration ============= There isn't much left to do apart from adding a few entries to ``INSTALLED_APPS``, most commonly you'll want to add ``feincms``, ``mptt``, ``feincms.module.page`` and ``feincms.module.medialibrary``. The customized administration interface needs some media and javascript libraries which you have to make available to the browser. FeinCMS uses Django's ``django.contrib.staticfiles`` application for this purpose, the media files will be picked up automatically by the ``collectstatic`` management command. If your website is multi-language you have to define ``LANGUAGES`` in the settings_. Please note that the ``feincms`` module will not create or need any database tables, but you need to put it into ``INSTALLED_APPS`` because otherwise the templates in ``feincms/templates/`` will not be found by the template loader. The tools contained in FeinCMS can be used for many CMS-related activities. The most common use of a CMS is to manage a hierarchy of pages and this is the most advanced module of FeinCMS too. Please proceed to :ref:`page` to find out how you can get the page module up and running. .. _settings: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-language-preferencefeincms-1.7.4/docs/integration.rst000066400000000000000000000415251212255543400171660ustar00rootroot00000000000000.. _integration: ========================================= Integrating 3rd party apps into your site ========================================= With FeinCMS come a set of standard views which you might want to check out before starting to write your own. Included is a standard view for pages, and a set of generic view drop-in replacements which know about the CMS. Default page handler ==================== The default CMS handler view is ``feincms.views.cbv.handler``. You can add the following as last line in your ``urls.py`` to make a catch-all for any pages which were not matched before:: from feincms.views.cbv.views import Handler handler = Handler.as_view() urlpatterns += patterns('', url(r'^$', handler, name='feincms_home'), url(r'^(.*)/$', handler, name='feincms_handler'), ) Note that this default handler can also take a keyword parameter ``path`` to specify which url to render. You can use that functionality to implement a default page by adding another entry to your ``urls.py``:: from feincms.views.cbv.views import Handler handler = Handler.as_view() ... url(r'^$', handler, {'path': '/rootpage'}, name='feincms_home') ... Please note that it's easier to include ``feincms.urls`` at the bottom of your own URL patterns like this:: # ... urlpatterns += patterns('', url(r'', include('feincms.urls')), ) The URLconf entry names ``feincms_home`` and ``feincms_handler`` must both exist somewhere in your project. The standard ``feincms.urls`` contains definitions for both. If you want to provide your own view, it's your responsability to create correct URLconf entries. Generic and custom views ======================== If you use FeinCMS to manage your site, chances are that you still want to use generic and/or custom views for certain parts. You probably still need a ``feincms_page`` object inside your template to generate the navigation and render regions not managed by the generic views. The best way to ensure the presence of a ``feincms_page`` instance in the template context is to add ``feincms.context_processors.add_page_if_missing`` to your ``TEMPLATE_CONTEXT_PROCESSORS`` setting. .. _integration-applicationcontent: Integrating 3rd party apps ========================== Third party apps such as django-registration can be integrated in the CMS too. :class:`~feincms.content.application.models.ApplicationContent` lets you delegate a subset of your page tree to a third party application. The only thing you need is specifying a URLconf file which is used to determine which pages exist below the integration point. Adapting the 3rd party application for FeinCMS ---------------------------------------------- The integration mechanism is very flexible. It allows the website administrator to add the application in multiple places or move the integration point around at will. Obviously, this flexibility puts several constraints on the application developer. It is therefore probable, that you cannot just drop in a 3rd party application and expect it to work. Modifications of ``urls.py`` and the templates will be required. The following examples all assume that we want to integrate a news application into FeinCMS. The :class:`~feincms.content.application.models.ApplicationContent` will be added to the page at ``/news/``, but that's not too important really, because the 3rd party app's assumption about where it will be integrated can be too easily violated. An example ``urls.py`` follows:: from django.conf.urls import patterns, include, url from django.views.generic.detail import DetailView from django.views.generic.list import ListView from news.models import Entry urlpatterns = patterns('', url(r'^$', ListView.as_view( queryset=Entry.objects.all(), ), name='entry_list'), url(r'^(?P[^/]+)/$', DetailView.as_view( queryset=Entry.objects.all(), ), name='entry_detail'), ) Please note that you should not add the ``news/`` prefix here. You should *not* reference this ``urls.py`` file anywhere in a ``include`` statement. Registering the 3rd party application with FeinCMS' ``ApplicationContent`` -------------------------------------------------------------------------- It's as simple as that:: from feincms.content.application.models import ApplicationContent from feincms.module.page.models import Page Page.create_content_type(ApplicationContent, APPLICATIONS=( ('news.urls', 'News application'), )) Writing the models ------------------ Because the URLconf entries ``entry_list`` and ``entry_detail`` aren't reachable through standard means (remember, they aren't ``include``\d anywhere) it's not possible to use standard ``reverse`` calls to determine the absolute URL of a news entry. FeinCMS provides its own ``app_reverse`` function (see :ref:`integration-reversing-urls` for details) and ``permalink`` decorator mimicking the interface of Django's standard functionality:: from django.db import models from feincms.content.application import models as app_models class Entry(models.Model): title = models.CharField(max_length=200) slug = models.SlugField() description = models.TextField(blank=True) class Meta: ordering = ['-id'] def __unicode__(self): return self.title @app_models.permalink def get_absolute_url(self): return ('entry_detail', 'news.urls', (), { 'slug': self.slug, }) The only difference is that you do not only have to specify the view name (``entry_detail``) but also the URLconf file (``news.urls``) for this specific ``permalink`` decorator. The URLconf string must correspond to the specification used in the ``APPLICATIONS`` list in the ``create_content_type`` call. .. note:: Previous FeinCMS versions only provided a monkey patched ``reverse`` method with a slightly different syntax for reversing URLs. This behavior is still available and as of now (FeinCMS 1.5) still active by default. It is recommended to start using the new way right now and add ``FEINCMS_REVERSE_MONKEY_PATCH = False`` to your settings file. Returning content from views ---------------------------- Three different types of return values can be handled by the application content code: * Unicode data (e.g. the return value of ``render_to_string``) * ``HttpResponse`` instances * A tuple consisting of two elements: A template instance, template name or list and a context ``dict``. More on this later under :ref:`integration-applicationcontent-inheritance20` Unicode data is inserted verbatim into the output. ``HttpResponse`` instances are returned directly to the client under the following circumstances: * The HTTP status code differs from ``200 OK`` (Please note that 404 errors may be ignored if more than one content type with a ``process`` method exists on the current CMS page.) * The resource was requested by ``XmlHttpRequest`` (that is, ``request.is_ajax`` returns ``True``) * The response was explicitly marked as ``standalone`` by the :func:`feincms.views.decorators.standalone` view decorator * The mimetype of the response was not ``text/plain`` or ``text/html`` Otherwise, the content of the response is unpacked and inserted into the CMS output as unicode data as if the view returned the content directly, not wrapped into a ``HttpResponse`` instance. If you want to customize this behavior, provide your own subclass of ``ApplicationContent`` with an overridden ``send_directly`` method. The described behavior is only a sane default and might not fit everyone's use case. .. note:: The string or response returned should not contain ```` or ```` tags because this would invalidate the HTML code returned by FeinCMS. .. _integration-applicationcontent-inheritance20: Letting the application content use the full power of Django's template inheritance ----------------------------------------------------------------------------------- If returning a simple unicode string is not enough and you'd like to modify different blocks in the base template, you have to ensure two things: * Use the class-based page handler. This is already the default if you include ``feincms.urls`` or ``feincms.views.cbv.urls``. * Make sure your application views use the third return value type described above: A tuple consisting of a template and a context ``dict``. The news application views would then look as follows. Please note the absence of any template rendering calls: ``views.py``:: from django.shortcuts import get_object_or_404 from news.models import Entry def entry_list(request): # Pagination should probably be added here return 'news/entry_list.html', {'object_list': Entry.objects.all()} def entry_detail(request, slug): return 'news/entry_detail', {'object': get_object_or_404(Entry, slug=slug)} ``urls.py``:: from django.conf.urls.defaults import patterns, include, url urlpatterns = patterns('news.views', url(r'^$', 'entry_list', name='entry_list'), url(r'^(?P[^/]+)/$', 'entry_detail', name='entry_detail'), ) The two templates referenced, ``news/entry_list.html`` and ``news/entry_detail.html``, should now extend a base template. The recommended notation is as follows:: {% extends feincms_page.template.path|default:"base.html" %} {% block ... %} {# more content snipped #} This ensures that the the selected CMS template is still used when rendering content. .. note:: Older versions of FeinCMS only offered fragments for a similar purpose. They are still suported, but it's recommended you switch over to this style instead. .. warning:: If you add two application content blocks on the same page and both use this mechanism, the later 'wins'. .. _integration-reversing-urls: More on reversing URLs ---------------------- Application content-aware URL reversing is available both for Python and Django template code. The function works almost like Django's own ``reverse()`` method except that it resolves URLs from application contents. The second argument, ``urlconf``, has to correspond to the URLconf parameter passed in the ``APPLICATIONS`` list to ``Page.create_content_type``:: from feincms.content.application.models import app_reverse app_reverse('mymodel-detail', 'myapp.urls', args=...) or:: app_reverse('mymodel-detail', 'myapp.urls', kwargs=...) The template tag has to be loaded from the ``applicationcontent_tags`` template tag library first:: {% load applicationcontent_tags %} {% app_reverse "mymodel_detail" "myapp.urls" arg1 arg2 %} or:: {% load applicationcontent_tags %} {% app_reverse "mymodel_detail" "myapp.urls" name1=value1 name2=value2 %} Storing the URL in a context variable is supported too:: {% load applicationcontent_tags %} {% app_reverse "mymodel_detail" "myapp.urls" arg1 arg2 as url %} Additional customization possibilities -------------------------------------- The ``ApplicationContent`` offers additional customization possibilites for those who need them. All of these must be specified in the ``APPLICATIONS`` argument to ``create_content_type``. * ``urls``: Making it easier to swap the URLconf file: You might want to use logical names instead of URLconf paths when you create your content types, so that the ``ApplicationContent`` apps aren't tied to a particular ``urls.py`` file. This is useful if you want to override a few URLs from a 3rd party application, f.e. replace ``registration.urls`` with ``yourapp.registration_urls``:: Page.create_content_type(ApplicationContent, APPLICATIONS=( ('registration', 'Account creation and management', { 'urls': 'yourapp.registration_urls', }), ) * ``admin_fields``: Adding more fields to the application content interface: Some application contents might require additional configuration parameters which should be modifyable by the website administrator. ``admin_fields`` to the rescue! :: def registration_admin_fields(form, *args, **kwargs): return { 'exclusive_subpages': forms.BooleanField( label=_('Exclusive subpages'), required=False, initial=form.instance.parameters.get('exclusive_subpages', True), help_text=_('Exclude everything other than the application\'s content when rendering subpages.'), ), } Page.create_content_type(ApplicationContent, APPLICATIONS=( ('registration', 'Account creation and management', { 'urls': 'yourapp.registration_urls', 'admin_fields': registration_admin_fields, }), ) The form fields will only be visible after saving the ``ApplicationContent`` for the first time. They are stored inside a JSON-encoded field. The values are added to the template context indirectly when rendering the main template by adding them to ``request._feincms_extra_context``. * ``path_mapper``: Customize URL processing by altering the perceived path of the page: The applicaton content uses the remainder of the URL to resolve the view inside the 3rd party application by default. This works fine most of the time, sometimes you want to alter the perceived path without modifying the URLconf file itself. If provided, the ``path_mapper`` receives the three arguments, ``request.path``, the URL of the current page and all application parameters, and must return a tuple consisting of the path to resolve inside the application content and the path the current page is supposed to have. This ``path_mapper`` function can be used to do things like rewrite the path so you can pretend that an app is anchored deeper than it actually is (e.g. /path/to/page is treated as "//" using a parameter value rather than "/" by the embedded app) * ``view_wrapper``: Decorate every view inside the application content: If the customization possibilites above aren't sufficient, ``view_wrapper`` can be used to decorate each and every view inside the application content with your own function. The function specified with ``view_wrapper`` receives an additional parameters besides the view itself and any arguments or keyword arguments the URLconf contains, ``appcontent_parameters`` containing the application content configuration. .. _page-ext-navigation: Letting 3rd party apps define navigation entries ------------------------------------------------ Short answer: You need the ``feincms.module.page.extensions.navigation`` extension module. Activate it like this:: Page.register_extensions('feincms.module.page.extensions.navigation') Please note however, that this call needs to come after all ``NavigationExtension`` subclasses have been processed, because otherwise they will not be available for selection in the page administration! (Yes, this is lame and yes, this is going to change as soon as we find a better solution. In the meantime, stick your subclass definition before the register_extensions call.) Because the use cases for extended navigations are so different, FeinCMS does not go to great lengths trying to cover them all. What it does though is to let you execute code to filter, replace or add navigation entries when generating a list of navigation entries. If you have a blog and you want to display the blog categories as subnavigation entries, you could do it as follows: #. Create a navigation extension for the blog categories #. Assign this navigation extension to the CMS page where you want these navigation entries to appear You don't need to do anything else as long as you use the built-in ``feincms_nav`` template tag -- it knows how to handle extended navigations. :: from feincms.module.page.extensions.navigation import NavigationExtension, PagePretender class BlogCategoriesNavigationExtension(NavigationExtension): name = _('blog categories') def children(self, page, **kwargs): for category in Category.objects.all(): yield PagePretender( title=category.name, url=category.get_absolute_url(), ) class PassthroughExtension(NavigationExtension): name = 'passthrough extension' def children(self, page, **kwargs): for p in page.children.in_navigation(): yield p Page.register_extensions('feincms.module.page.extensions.navigation') Note that the objects returned should at least try to mimic a real page so navigation template tags as ``siblings_along_path_to`` and friends continue to work, ie. at least the following attributes should exist: :: title = '(whatever)' url = '(whatever)' # Attributes that MPTT assumes to exist parent_id = page.id tree_id = page.tree_id level = page.level+1 lft = page.lft rght = page.rght feincms-1.7.4/docs/medialibrary.rst000066400000000000000000000105651212255543400173070ustar00rootroot00000000000000.. _medialibrary: ============= Media library ============= .. module:: feincms.module.medialibrary The media library module provides a way to store, transform and display files of arbitrary types. The following instructions assume, that you use the media library together with the page module. However, the media library does not depend on any aspect of the page module -- you can use it with any CMS base model. To activate the media library and use it together with the page module, it is best to first get the page module working with a few content types. Afterwards, add :mod:`feincms.module.medialibrary` to your ``INSTALLED_APPS`` setting, and create a content type for a media file as follows:: from feincms.module.page.models import Page from feincms.content.medialibrary.v2 import MediaFileContent Page.create_content_type(MediaFileContent, TYPE_CHOICES=( ('default', _('default')), ('lightbox', _('lightbox')), )) ``TYPE_CHOICES`` has nothing to do with file types -- it's about choosing the presentation type for a certain media file, f.e. whether the media file should be presented inline, in a lightbox, floated, or simply as a download link. Configuration ============= The location and URL of the media library may be configured either by setting the appropriate variables in your ``settings.py`` file or in your CMS defining module. The file system path for all media library files is defined using Django's ``MEDIA_ROOT`` setting and FeinCMS' ``FEINCMS_MEDIALIBRARY_UPLOAD_TO`` setting which defaults to ``medialibrary/%Y/%m/``. These settings can also be changed programmatically using ``MediaFile.reconfigure(upload_to=..., storage=...)`` Rendering media file contents ============================= A set of recognition functions will be run on the file name to determine the file type. Using combinations of the name and type, the default render method tries to find a template for rendering the :class:`~feincms.content.medialibrary.models.MediaFileContent`. The default set of pre-defined content types and recognition functions is:: MediaFileBase.register_filetypes( ('image', _('Image'), lambda f: re.compile(r'\.(bmp|jpe?g|jp2|jxr|gif|png|tiff?)$', re.IGNORECASE).search(f)), ('video', _('Video'), lambda f: re.compile(r'\.(mov|m[14]v|mp4|avi|mpe?g|qt|ogv|wmv)$', re.IGNORECASE).search(f)), ('audio', _('Audio'), lambda f: re.compile(r'\.(au|mp3|m4a|wma|oga|ram|wav)$', re.IGNORECASE).search(f)), ('pdf', _('PDF document'), lambda f: f.lower().endswith('.pdf')), ('swf', _('Flash'), lambda f: f.lower().endswith('.swf')), ('txt', _('Text'), lambda f: f.lower().endswith('.txt')), ('rtf', _('Rich Text'), lambda f: f.lower().endswith('.rtf')), ('zip', _('Zip archive'), lambda f: f.lower().endswith('.zip')), ('doc', _('Microsoft Word'), lambda f: re.compile(r'\.docx?$', re.IGNORECASE).search(f)), ('xls', _('Microsoft Excel'), lambda f: re.compile(r'\.xlsx?$', re.IGNORECASE).search(f)), ('ppt', _('Microsoft PowerPoint'), lambda f: re.compile(r'\.pptx?$', re.IGNORECASE).search(f)), ('other', _('Binary'), lambda f: True), # Must be last ) You can add to that set by calling ``MediaFile.register_filetypes()`` with your new file types similar to the above. If we've got an example file ``2009/06/foobar.jpg`` and a presentation type of ``inline``, the templates tried to render the media file are the following: * ``content/mediafile/image_inline.html`` * ``content/mediafile/image.html`` * ``content/mediafile/inline.html`` * ``content/mediafile/default.html`` You are of course free to do with the file what you want inside the template, for example a thumbnail and a lightbox version of the image file, and put everything into an element that's floated to the left. Media file metadata =================== Sometimes, just storing media files is not enough. You've got captions and copyrights which you'd like to store alongside the media file. This media library allows that. The caption may even be translated into different languages. This is most often not necessary or does not apply to copyrights, therefore the copyright can only be entered once, not once per language. The default image template ``content/mediafile/image.html`` demonstrates how the values of those fields can be retrieved and used. feincms-1.7.4/docs/migrations.rst000066400000000000000000000027771212255543400170250ustar00rootroot00000000000000.. _migrations: ================================================= Database migration support for FeinCMS with South ================================================= If you don't know what South_ is you should probably go and read about it right now! .. _South: http://south.aeracode.org/ FeinCMS itself does not come with any migrations. It does not have to: Its core models haven't changed for several versions now. This does not mean South isn't supported! You are free to use South to manage FeinCMS' models which is a very useful technique especially if you are using :ref:`page-extensions`. The following steps should be sufficient to get up and running with South in your project: * Put a copy of South somewhere on your ``PYTHONPATH``, with ``pip``, ``hg`` or whatever pleases you most. * Add ``'south'`` to ``INSTALLED_APPS``. * Create a new folder in your app with an empty ``__init__.py`` file inside, e.g. ``yourapp/migrate/``. * Add the following configuration variable to your ``settings.py``:: SOUTH_MIGRATION_MODULES = { 'page': 'yourapp.migrate.page', 'medialibrary': 'yourapp.migrate.medialibrary', # if you are using the medialibrary # which comes with FeinCMS } * Run ``./manage.py convert_to_south page`` and ``./manage.py convert_to_south medialibrary`` * That's it! .. warning:: You **must not** use ``migrations`` as folder name for the FeinCMS migrations, otherwise South **will** get confused. feincms-1.7.4/docs/page.rst000066400000000000000000000345431212255543400155610ustar00rootroot00000000000000.. _page: ======================== The built-in page module ======================== .. module:: feincms.module.page FeinCMS is primarily a system to work with lists of content blocks which you can assign to arbitrary other objects. You do not necessarily have to use it with a hierarchical page structure, but that's the most common use case of course. Being able to put content together in small manageable pieces is interesting for other uses too, e.g. for weblog entries where you have rich text content interspersed with images, videos or maybe even galleries. Activating the page module and creating content types ===================================================== To activate the page module, you need to follow the instructions in :ref:`installation` and afterwards add :mod:`feincms.module.page` to your :data:`INSTALLED_APPS`. Before proceeding with ``manage.py syncdb``, it might be a good idea to take a look at :ref:`page-extensions` -- the page module does have the minimum of features in the default configuration and you will probably want to enable several extensions. You need to create some content models too. No models are created by default, because there is no possibility to unregister models. A sane default might be to create :class:`~feincms.content.medialibrary.models.MediaFileContent` and :class:`~feincms.content.richtext.models.RichTextContent` models; you can do this by adding the following lines somewhere into your project, for example in a ``models.py`` file that will be processed anyway:: from django.utils.translation import ugettext_lazy as _ from feincms.module.page.models import Page from feincms.content.richtext.models import RichTextContent from feincms.content.medialibrary.models import MediaFileContent Page.register_extensions('datepublisher', 'translations') # Example set of extensions Page.register_templates({ 'title': _('Standard template'), 'path': 'base.html', 'regions': ( ('main', _('Main content area')), ('sidebar', _('Sidebar'), 'inherited'), ), }) Page.create_content_type(RichTextContent) Page.create_content_type(MediaFileContent, TYPE_CHOICES=( ('default', _('default')), ('lightbox', _('lightbox')), )) It will be a good idea most of the time to register the :class:`~feincms.content.richtext.models.RichTextContent` first, because it's the most used content type for many applications. The content type dropdown will contain content types in the same order as they were registered. Please note that you should put these statements into a ``models.py`` file of an app contained in ``INSTALLED_APPS``. That file is executed at Django startup time. Setting up the admin interface ============================== The customized admin interface code is contained inside the :class:`ModelAdmin` subclass, so you do not need to do anything special here. If you use the :class:`~feincms.content.richtext.models.RichTextContent`, you need to download `TinyMCE `_ and configure FeinCMS' richtext support:: FEINCMS_RICHTEXT_INIT_CONTEXT = { 'TINYMCE_JS_URL': STATIC_URL + 'your_custom_path/tiny_mce.js', } Wiring up the views =================== Just add the following lines to your ``urls.py`` to get a catch-all URL pattern: :: urlpatterns += patterns('', url(r'', include('feincms.urls')), ) If you want to define a page as home page for the whole site, you can give it an :attr:`~Page.override_url` value of ``'/'``. More information can be found in :ref:`integration` Adding another content type =========================== Imagine you've got a third-party gallery application and you'd like to include excerpts of galleries inside your content. You'd need to write a :class:`GalleryContent` base class and let FeinCMS create a model class for you with some important attributes added. :: from django.db import models from django.template.loader import render_to_string from feincms.module.page.models import Page from gallery.models import Gallery class GalleryContent(models.Model): gallery = models.ForeignKey(Gallery) class Meta: abstract = True # Required by FeinCMS, content types must be abstract def render(self, **kwargs): return render_to_string('gallery/gallerycontent.html', { 'content': self, # Not required but a convention followed by # all of FeinCMS' bundled content types 'images': self.gallery.image_set.order_by('?')[:5], }) Page.create_content_type(GalleryContent) The newly created :class:`GalleryContent` for :class:`~feincms.module.page.models.Page` will live in the database table ``page_page_gallerycontent``. .. note:: FeinCMS requires your content type model to be abstract. More information about content types is available in :ref:`contenttypes`. .. _page-extensions: Page extension modules ====================== .. module:: feincms.module.page.extension Extensions are a way to put often-used functionality easily accessible without cluttering up the core page model for those who do not need them. The extensions are standard python modules with a :func:`register` method which will be called upon registering the extension. The :func:`register` method receives the :class:`~feincms.module.page.models.Page` class itself and the model admin class :class:`~feincms.module.page.models.PageAdmin` as arguments. The extensions can be activated as follows:: Page.register_extensions('navigation', 'titles', 'translations') The following extensions are available currently: * :mod:`~feincms.module.extensions.changedate` --- Creation and modification dates Adds automatically maintained creation and modification date fields to the page. * :mod:`~feincms.module.extensions.ct_tracker` --- Content type cache Helps reduce database queries if you have three or more content types. * :mod:`~feincms.module.extensions.datepublisher` --- Date-based publishing Adds publication date and end date fields to the page, thereby enabling the administrator to define a date range where a page will be available to website visitors. * :mod:`~feincms.module.page.extensions.excerpt` --- Page summary Add a brief excerpt summarizing the content of this page. * :mod:`~feincms.module.extensions.featured` --- Simple featured flag for a page Lets administrators set a featured flag that lets you treat that page special. * :mod:`~feincms.module.page.extensions.navigation` --- Navigation extensions Adds navigation extensions to the page model. You can define subclasses of ``NavigationExtension``, which provide submenus to the navigation generation mechanism. See :ref:`page-ext-navigation` for more information on how to use this extension. * :mod:`~feincms.module.page.extensions.relatedpages` --- Links related content Add a many-to-many relationship field to relate this page to other pages. * :mod:`~feincms.module.extensions.seo` --- Search engine optimization Adds fields to the page relevant for search engine optimization (SEO), currently only meta keywords and description. * :mod:`~feincms.module.page.extensions.sites` --- Limit pages to sites Allows to limit a page to a certain site and not display it on other sites. * :mod:`~feincms.module.page.extensions.symlinks` --- Symlinked content extension Sometimes you want to reuse all content from a page in another place. This extension lets you do that. * :mod:`~feincms.module.page.extensions.titles` --- Additional titles Adds additional title fields to the page model. You may not only define a single title for the page to be used in the navigation, the tag and inside the content area, you are not only allowed to define different titles for the three uses but also enabled to define titles and subtitles for the content area. * :mod:`~feincms.module.extensions.translations` --- Page translations Adds a language field and a recursive translations many to many field to the page, so that you can define the language the page is in and assign translations. I am currently very unhappy with state of things concerning the definition of translations, so that extension might change somewhat too. This extension also adds new instructions to the setup_request method where the Django i18n tools are initialized with the language given on the page object. While it is not required by FeinCMS itself it's still recommended to add :class:`django.middleware.locale.LocaleMiddleware` to the ``MIDDLEWARE_CLASSES``; otherwise you will see strange language switching behavior in non-FeinCMS managed views (such as third party apps not integrated using :class:`feincms.content.application.models.ApplicationContent` or Django's own administration tool). You need to have defined ``settings.LANGUAGES`` as well. .. note:: These extension modules add new fields to the ``Page`` class. If you add or remove page extensions after you've run ``syncdb`` for the first time you have to change the database schema yourself, or use :ref:`migrations`. Using page request processors ============================= A request processor is a function that gets the currently selected page and the request as parameters and returns either None (or nothing) or a HttpResponse. All registered request processors are run before the page is actually rendered. If the request processor indeed returns a :class:`HttpResponse`, further rendering of the page is cut short and this response is returned immediately to the client. This allows for various actions dependent on page and request, for example a simple user access check can be implemented like this:: def authenticated_request_processor(page, request): if not request.user.is_authenticated(): return HttpResponseForbidden() Page.register_request_processor(authenticated_request_processor) ``register_request_processor`` has an optional second argument named ``key``. If you register a request processor with the same key, the second processor replaces the first. This is especially handy to replace the standard request processors named ``path_active`` (which checks whether all ancestors of a given page are active too) and ``redirect`` (which issues HTTP-level redirects if the ``redirect_to`` page field is filled in). Using page response processors ============================== Analogous to a request processor, a response processor runs after a page has been rendered. It needs to accept the page, the request and the response as parameters and may change the response (or throw an exception, but try not to). A response processor is the right place to tweak the returned http response for whatever purposes you have in mind. :: def set_random_header_response_processor(page, request, response): response['X-Random-Number'] = 42 Page.register_response_processor(set_random_header_response_processor) ``register_response_processor`` has an optional second argument named ``key``, exactly like ``register_request_processor`` above. It behaves in the same way. WYSIWYG Editors =============== TinyMCE is configured by default to only allow for minimal formatting. This has proven to be the best compromise between letting the client format text without destroying the page design concept. You can customize the TinyMCE settings by creating your own init_richtext.html that inherits from `admin/content/richtext/init_tinymce.html`. You can even set your own CSS and linklist files like so:: FEINCMS_RICHTEXT_INIT_CONTEXT = { 'TINYMCE_JS_URL': STATIC_URL + 'your_custom_path/tiny_mce.js', 'TINYMCE_CONTENT_CSS_URL': None, # add your css path here 'TINYMCE_LINK_LIST_URL': None # add your linklist.js path here } FeinCMS is set up to use TinyMCE_ but you can use CKEditor_ instead if you prefer that one. Change the following settings:: FEINCMS_RICHTEXT_INIT_TEMPLATE = 'admin/content/richtext/init_ckeditor.html' FEINCMS_RICHTEXT_INIT_CONTEXT = { 'CKEDITOR_JS_URL': STATIC_URL + 'path_to_your/ckeditor.js', } .. _TinyMCE: http://www.tinymce.com/ .. _CKEditor: http://ckeditor.com/ ETag handling ============= An ETag is a string that is associated with a page -- it should change if (and only if) the page content itself has changed. Since a page's content may depend on more than just the raw page data in the database (e.g. it might list its children or a navigation tree or an excerpt from some other place in the CMS alltogether), you are required to write an etag producing method for the page. :: # Very stupid etag function, a page is supposed the unchanged as long # as its id and slug do not change. You definitely want something more # involved, like including last change dates or whatever. def my_etag(page, request): return 'PAGE-%d-%s' % ( page.id, page.slug ) Page.etag = my_etag Page.register_request_processors(Page.etag_request_processor) Page.register_response_processors(Page.etag_response_processor) Sitemaps ======== To create a sitemap that is automatically populated with all pages in your Feincms site, add the following to your top-level urls.py:: from feincms.module.page.sitemap import PageSitemap sitemaps = {'pages' : PageSitemap} urlpatterns += patterns('', url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}), ) This will produce a default sitemap at the /sitemap.xml url. A sitemap can be further customised by passing it appropriate parameters, like so:: sitemaps = {'pages': PageSitemap(max_depth=2)} The following parameters can be used to modify the behaviour of the sitemap: * ``navigation_only`` -- if set to True, only pages that are in_navigation will appear in the site map. * ``max_depth`` -- if set to a non-negative integer, will limit the sitemap generated to this page hierarchy depth. * ``changefreq`` -- should be a string or callable specifying the page update frequency, according to the sitemap protocol. * ``queryset`` -- pass in a query set to restrict the Pages to include in the site map. * ``filter`` -- pass in a callable that transforms a queryset to filter out the pages you want to include in the site map. * ``extended_navigation`` -- if set to True, adds pages from any navigation extensions. If using PagePretender, make sure to include title, url, level, in_navigation and optionally modification_date. �������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/releases/������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0015705�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/releases/1.2.rst�����������������������������������������������������������������0000664�0000000�0000000�00000003066�12122555434�0016744�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������========================= FeinCMS 1.2 release notes ========================= Welcome to the first release notes for FeinCMS! Overview ======== FeinCMS 1.2 sports several large changes, including: * Overhauled item editor. The new item editor uses standard Django administration fieldsets; you can use almost all standard Django configuration mechanisms. ``show_on_top`` has been deprecated, standard ``fieldsets`` should be used instead. * The split pane editor has been removed. It wasn't much more than a proof of concept and was never bug-free. * The required Django version is now 1.2. Compatibility with older Django versions has been removed. * The rich text configuration has slightly changed; ``CkRichTextContent`` has been completely removed in favor of a rich text editor agnostic configuration method. ``TINYMCE_JS_URL`` should be replaced by an appropriate ``FEINCMS_RICHTEXT_INIT_CONTEXT`` settings value. See the :ref:`contenttypes` documentation for more details. * A new content type, ``TemplateContent`` has been added which can be used to render templates residing on the hard disk. * The ``TreeEditor`` JavaScript code has been rewritten, reintroducing drag-drop for reordering pages, but this time in a well-performing way not sluggish as before. * ``feincms.models.Base`` is still available, ``feincms.models.create_base_model`` is the more flexible way of creating the aforementioned base model. If ``create_base_model`` is used the base model can be freely defined. * Many small improvements and bugfixes all over the place. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/releases/1.3.rst�����������������������������������������������������������������0000664�0000000�0000000�00000012662�12122555434�0016747�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������========================= FeinCMS 1.3 release notes ========================= FeinCMS 1.3 includes many bugfixes and cleanups and a number of new features. The cleanups and features caused a few backwards incompatible changes. The upgrade path is outlined below. Highlights ========== * FeinCMS pages use the standard Django permalink mechanism inside the ``get_absolute_url`` implementation. This means that you have to update the URL definition if you did not include ``feincms.urls`` directly. Change this:: url(r'^$|^(.*)/$', 'feincms.views.base.handler'), to this:: url(r'', include('feincms.urls')), Defining the URL patterns directly is still possible. Have a look at ``feincms.urls`` to find out how this should be done. * FeinCMS requires at least Django 1.2 but already has support for Django 1.3 features such as staticfiles. The FeinCMS media file folder has been moved from ``feincms/media/feincms`` to ``feincms/static/feincms`` - if you use ``django.contrib.staticfiles`` with Django 1.3 (and you should!), FeinCMS' media files for the administration interface will automatically be made available without any further work on your part. * Content types can specify the media files (Javascript and CSS files) they need to work correctly. See :ref:`contenttypes-extramedia` for information on how to use this in your own content types. * The content type loading process has been streamlined and requires much less database queries than before. The performance hit on sites with deep page hierarchies, inheritance and many regions is several times smaller than before. * The content type interface has been extended with two new methods, available for all content types which need it: ``process`` is called before rendering pages and is guaranteed to receive the current request instance. Each and every content type (not only application contents as before) has the ability to return full HTTP responses which are returned directly to the user. ``finalize`` is called after rendering and can be used to set HTTP headers and do other post-processing tasks. See :ref:`contenttypes-processfinalize` for more information. (Backwards incompatible and other) Changes ========================================== * The default ``ContentProxy`` has been rewritten to load all content type instances on initialization. The instances stay around for the full request-response cycle which allows us to remove many quasi-global variables (variables attached to the ``request`` object). The new initialization is much more efficient in terms of SQL queries needed; the implementation is contained inside the ``ContentProxy`` class and not distributed all over the place. * The ``ContactFormContent`` has been updated to take advantage of the new content type interface where content types can influence the request-response cycle in more ways. * The ``ct_tracker`` extension has been rewritten to take advantage of the new ``ContentProxy`` features. This means that the format of ``_ct_inventory`` could not be kept backwards compatible and has been changed. The inventory is versioned now, therefore upgrading should not require any action on your part. * ``feincms_site`` is not available in the context anymore. It was undocumented, mostly unused and badly named anyway. If you still need this functionality you should use ``django.contrib.sites`` directly yourself. * The ``_feincms_appcontent_parameters`` has been folded into the ``_feincms_extra_context`` attribute on the current request. The ``appcontent_parameters`` template tag is not necessary anymore (the content of ``_feincms_extra_context`` is guaranteed to be available in the template context) and has been removed. In your appcontent code, change all references of ``_feincms_appcontent_parameters`` to ``_feincms_extra_context``, e.g. params = getattr(request, '_feincms_appcontent_parameters', {}) becomes params = getattr(request, '_feincms_extra_context', {}) * As part of the effort to reduce variables attached to the request object (acting as a replacement for global variables), ``request.extra_path`` has been removed. The same information can be accessed via ``request._feincms_extra_context['extra_path']``. * The ``feincms.views.applicationcontent`` module has been removed. The special casing it provided for application content-using pages aren't necessary anymore. * The page's ``get_absolute_url`` method uses URL reversion for determining the URL of pages instead of returning ``_cached_url``. This means that you need to modify your URLconf entries if you added them to your own ``urls.py`` instead of including ``feincms.urls``. Please make sure that you have two named URL patterns, ``feincms_home`` and ``feincms_handler``:: from feincms.views.base import handler urlpatterns = patterns('', # ... your patterns ... url(r'^$', handler, name='feincms_home'), url(r'^(.*)/$', handler, name='feincms_handler'), ) If you want the old behavior back, all you need to do is add the following code to your ``settings.py``:: ABSOLUTE_URL_OVERRIDES = { 'page.page': lambda page: page._cached_url, } * The copy/replace and preview mechanisms never worked quite right. They were completely dropped from this release. If you still need the ability to create copies of objects, use the standard Django ``ModelAdmin.save_as`` feature. ������������������������������������������������������������������������������feincms-1.7.4/docs/releases/1.4.rst�����������������������������������������������������������������0000664�0000000�0000000�00000007326�12122555434�0016751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������========================= FeinCMS 1.4 release notes ========================= * FeinCMS supports more than one site from the same database with ``django.contrib.sites`` now. Thanks to Bojan Mihelac and Stephen Tyler for the work and insistence on this issue. * It is possible to customize the administration model inline used for content types. This means that it's possible to customize more aspects of content type editing and to reuse more behaviors from Django itself, such as ``raw_id_fields``. * FeinCMS has gained support for ``django-reversion``. * Reusing the media library in your own content types has become much easier than before. When using a ``feincms.module.medialibrary.fields.MediaFileForeignKey`` instead of the standard ``django.db.models.ForeignKey`` and adding the media file foreign key to ``raw_id_fields``, you get the standard Django behavior supplemented with a thumbnail if the media file is an image. This requires the next feature too, which is... * Custom ``InlineModelAdmin`` classes may be used for the content types now by adding a ``feincms_item_editor_inline`` attribute to the content type specifying the inline class to be used. * New projects should use ``feincms.content.medialibrary.v2.MediaFileContent`` instead of ``feincms.content.medialibrary.models.MediaFileContent``. The argument ``POSITION_CHOICES`` and the corresponding field have been renamed to ``TYPE_CHOICES`` and ``type`` because that's a more fitting description of the intended use. The old and the new media file content should not be mixed; the hand-woven ``raw_id_fields`` support of the old media file content was not specific enough and interferes with Django's own ``raw_id_fields`` support. * FeinCMS has gained a preview feature for pages which shouldn't be accessible to the general public yet. Just add the following line above the standard FeinCMS handler:: url(r'', include('feincms.contrib.preview.urls')), Another button will be automatically added in the page item editor. Apart from all these new features a few cleanups have been made: * FeinCMS 1.2 removed the CKEditor-specific rich text content in favor of a generalized rich text content supporting different rich text editors. Unfortunately the documentation and the available settings only reflected this partially. This has been rectified. Support for ``TINYMCE_JS_URL``, ``FEINCMS_TINYMCE_INIT_TEMPLATE`` and ``FEINCMS_TINYMCE_INIT_CONTEXT`` has been completely removed. The two settings ``FEINCMS_RICHTEXT_INIT_CONTEXT`` and ``FEINCMS_RICHTEXT_INIT_TEMPLATE`` should be used instead. See the :ref:`contenttypes` documentation for more details. * The two settings ``FEINCMS_MEDIALIBRARY_ROOT`` and ``FEINCMS_MEDIALIBRARY_URL`` have been removed. Their values always defaulted to ``MEDIA_ROOT`` and ``MEDIA_URL``. The way they were used made it hard to support other storage backends in the media library. If you still need to customize the storage class used in the media library have a look at ``MediaFile.reconfigure``. * Support for the ``show_on_top`` option for the ``ItemEditor`` has been completely removed. This functionality has been deprecated since 1.2. * A few one-line Page manager methods which were too similar to each other have been deprecated. They will be removed in the next release of FeinCMS. This concerns ``page_for_path_or_404``, ``for_request_or_404``, ``best_match_for_request`` and ``from_request``. The improved ``for_request`` method should cover all bases. * A few page methods have been deprecated. This concerns ``active_children``, ``active_children_in_navigation`` and ``get_siblings_and_self``. The useful bits are already available through Django's own related managers. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/releases/1.5.rst�����������������������������������������������������������������0000664�0000000�0000000�00000011103�12122555434�0016736�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������========================= FeinCMS 1.5 release notes ========================= Explicit reversing of URLs from ``ApplicationContent``-embedded apps ==================================================================== URLs from third party apps embedded via ``ApplicationContent`` have been traditionally made reversable by an ugly monkey patch of ``django.core.urlresolvers.reverse``. This mechanism has been deprecated and will be removed in future FeinCMS versions. To reverse an URL of a blog entry, instead of this:: # deprecated from django.core.urlresolvers import reverse reverse('blog.urls/blog_detail', kwargs={'year': 2011, 'slug': 'some-slug'}) do this:: from feincms.content.application.models import app_reverse app_reverse('blog_detail', 'blog.urls', kwargs={'year': 2011, 'slug': 'some-slug'}) If you do not want to use the monkey patching behavior anymore, set ``FEINCMS_REVERSE_MONKEY_PATCH = False`` in your settings file. The new method is accessible inside a template too:: {% load applicationcontent_tags %} {# You have to quote the view name and the URLconf as in Django's future {% url %} tag. #} {% app_reverse "blog_detail" "blog.urls" year=2011 slug='some-slug' %} Inheritance 2.0 =============== It's possible to use Django's template inheritance from third party applications embedded through ``ApplicationContent`` too. To use this facility, all you have to do is return a tuple consisting of the template and the context. Instead of:: def my_view(request): # ... return render_to_response('template.html', {'object': ...}) simply use:: def my_view(request): # ... return 'template.html', {'object': ...} .. note:: ``template.html`` should extend a base template now. Better support of ``InlineModelAdmin`` options for content types ================================================================ The ``FeinCMSInline`` only differs from a stock StackedInline in differing defaults of ``form``, ``extra`` and ``fk_name``. All inline options should be supported now, especially ``raw_id_fields`` and ``fieldsets``. Minor changes ============= * The main CMS view is now based on Django's class-based generic views. Inheritance 2.0 will not work with the old views. You don't have to do anything if you use ``feincms.urls`` (as is recommended). * Request and response processors have been moved out of the ``Page`` class into their own module, ``feincms.module.page.processors``. They are still accessible for some time at the old place. * ``django.contrib.staticfiles`` is now a mandatory dependency for the administration interface. * The ``active`` and ``in_navigation`` booleans on the ``Page`` class now default to ``True``. * The minimum version requirements have changed. Django versions older than 1.3 aren't supported anymore, django-mptt must be 0.4 upwards. * The mptt tree rebuilders have been removed; django-mptt offers tree rebuilding functionality itself. * ``django-queryset-transform`` has been imported under ``feincms.utils`` and is used for speeding up various aspects of the media library. The prefilled attributes have been deprecated, because ``django-queryset-transform`` can be used to do everything they did, and better. * ``PageManager.active_filters`` has been converted from a list to a ``SortedDict``. This means that replacing or removing individual filters has become much easier than before. If you only used the public methods for registering new filters you don't have to change anything. * The same has been done with the request and response processors. * The ``TemplateContent`` has been changed to use the ``filesystem`` and the ``app_directories`` template loaders directly. It can be used together with the cached template loader now. * The tree editor has received a few usability fixes with (hopefully) more to come. * ``Page.setup_request`` can be called repeatedly without harm now. The return value of the first call is cached and returned on subsequent calls which means that request processors are run at most once. * Extensions such as ``translations`` and ``datepublisher`` which were only usable with the page module have been made more generic and are available for other FeinCMS-derived models too. * Media files from the medialibrary can be exported and imported in bulk. * When creating a new translation of a page, content is only copied from the original translation when the new page does not have any content yet. Furthermore the user is notified that some content-copying has happened. * A few bugs have been fixed. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/releases/1.6.rst�����������������������������������������������������������������0000664�0000000�0000000�00000021564�12122555434�0016753�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������========================= FeinCMS 1.6 release notes ========================= Welcome to FeinCMS 1.6! Backwards-incompatible changes ============================== Reversing application content URLs ---------------------------------- The default value of ``FEINCMS_REVERSE_MONKEY_PATCH`` has been changed to ``False``. Support for monkey-patching the ``reverse()`` method to support the old ``'urlconf/viewname'`` notation will be removed in the 1.7 release. Improvements to the bundled file and image contents --------------------------------------------------- * ``ImageContent``, ``FileContent`` and ``VideoContent`` now have pretty icons out-of-the-box. * ``ImageContent`` now accepts optional ``FORMAT_CHOICES`` for use with FeinCMS' bundled thumbnailers, as well as ``caption`` and ``alt_text`` fields. .. note:: If you are upgrading from an earlier version of FeinCMS, you'll have to add the new database columns yourself or use a migration tool like South to do it for you. Instructions for MySQL and the page module follow:: ALTER TABLE page_page_imagecontent ADD COLUMN `alt_text` varchar(255) NOT NULL; ALTER TABLE page_page_imagecontent ADD COLUMN `caption` varchar(255) NOT NULL; If you want to use ``FORMAT_CHOICES``:: ALTER TABLE page_page_imagecontent ADD COLUMN `format` varchar(64) NOT NULL; * ``FileContent`` now displays the size of the file in the default template, and uses ``span`` elements to allow styling of the title / size. Removal of deprecated features ------------------------------ * Deprecated page manager methods have been removed. You should use ``Page.objects.for_request`` instead of the following manager methods: * ``Page.objects.page_for_path_or_404()`` * ``Page.objects.for_request_or_404()`` * ``Page.objects.best_match_for_request()`` * ``Page.objects.from_request()`` * Deprecated page methods have been removed: * ``Page.active_children()``: Use ``Page.children.active()`` instead. * ``Page.active_children_in_navigation()``: Use ``Page.children.in_navigation()`` instead. * ``Page.get_siblings_and_self()``: You probably wanted ``self.parent.children.active()`` or ``self.get_siblings(include_self=True).active()`` anyway. * The shortcuts ``Page.register_request_processors()`` and ``Page.register_response_processors()`` to register several request or response processors at once have been removed in favor of their counterparts which only allow one processor at a time, but allow for replacing FeinCMS' included processors, ``require_path_active_request_processor`` and ``redirect_request_processor``. * It is not possible anymore to access the request and response processors as methods of the ``Page`` class. The processors are all in ``feincms.module.page.processors`` now. * The deprecated support for prefilled attributes has been removed. Use Django's own ``prefetch_related`` or ``feincms.utils.queryset_transform`` instead. * The deprecated ``feincms.views.base`` module has been removed. The code has been moved to ``feincms.views.legacy`` during the FeinCMS v1.5 cycle. New deprecations ---------------- * The view decorator ``feincms.views.decorators.add_page_to_extra_context`` has been deprecated as it was mostly used with function-based generic views, which have been deprecated in Django as well. Use Django's class-based generic views and the ``feincms.context_processors.add_page_if_missing`` context processor if you need similar functionality instead. * The content type ``feincms.content.medialibrary.models.MediaFileContent`` has been deprecated since FeinCMS v1.4. The whole module has been deprecated now and will be replaced with the contents of ``feincms.content.medialibrary.v2`` in FeinCMS v1.7. The ``v2`` module will stay around for another release or two so that code using ``v2`` will continue working with FeinCMS v1.8 (at least). * The template tag ``feincms_navigation`` has been superseded by ``feincms_nav`` which fixes a few problems with the old code and is generally much more maintainable. The old version will stay around for one more version and will be removed for FeinCMS v1.8. The only difference (apart from the bugfixes and the slightly different syntax) is that ``feincms_nav`` unconditionally uses navigation extensions. Additionally, ``feincms_navigation`` uses ``feincms_nav``'s implementation behind the scenes, which means that the ``extended`` argument does not have an effect anymore (it's always active). * The HTML cleaning support in ``feincms.utils.html.cleanse`` which could be easily used in the ``RichTextContent`` by passing ``cleanse=True`` has been copied into its own Python package, `feincms-cleanse <http://pypi.python.org/pypi/feincms-cleanse>`_. You should start passing a callable to ``cleanse`` right now. The existing support for cleansing will only be available up to FeinCMS v1.7. * FeinCMS v1.8 will not support shorthands anymore when registering extensions. Always provide the full python path to the extension file (or pass callables) to ``feincms.models.Base.register_extensions``. That is, ``Page.register_extensions('feincms.module.extensions.ct_tracker')`` should be used instead of ``Page.register_extensions('ct_tracker')``. While it is a bit more work it will make it much more explicit what's going on. Compatibility with Django and other apps ---------------------------------------- FeinCMS 1.6 requires Django 1.4. If you want to use django-reversion with FeinCMS you have to use django-reversion 1.6 or newer. Notable features and improvements ================================= * The bundled content types take additional steps to ensure that the main view context is available in content types' templates. If you only use the rendering tags (``feincms_render_region`` and ``feincms_render_content``) you can take advantage of all variables from your context processors in content types' templates too. Furthermore, those templatetags have been simplified by using Django's ``template.Library.simple_tag`` method now, which means that filters etc. are supported as template tag arguments now. * ``MediaFile`` does no longer auto-rotate images on upload. It really is not a media library's job to magically modify user content; if needed, it should be done in an image filter (like sorl). Also, reading through the image data seems to have a side effect on some external storage engines which then would only save half the image data, see issue #254. Additionally, FeinCMS does not try anymore to detect whether uploaded files really are images, and only looks at the file extension by default. We did not peek at the contents of other file types either. * A new model field has been added, ``feincms.contrib.richtext.RichTextField``. This is a drop-in replacement for Django's ``models.TextField`` with the difference that it adds the CSS classes required by rich text fields in the item editor. * The value of ``FEINCMS_FRONTEND_EDITING`` defaults to ``False`` now. * Frontend editing can now safely be used with caching. This is accomplished by saving state in a cookie instead of creating sessions all the time. * The ``SectionContent`` content type has been updated and does properly use ``raw_id_fields`` for the media files instead of the hack which was used before. * It is now possible to specify a different function for generating thumbnails in the media library administration. Set the setting ``FEINCMS_MEDIALIBRARY_THUMBNAIL`` to a function taking a media file instance and returning a URL to a thumbnail image or nothing if the file type cannot be handled by the thumbnailer. * Thumbnails generated by the bundled ``|thumbnail`` and ``|cropscale`` template filters are stored separately from the uploaded files now. This change means that all thumbnails will be automatically regenerated after a FeinCMS update. If you need the old behavior for some reason, set the setting ``FEINCMS_THUMBNAIL_DIR`` to an empty string. The default setting is ``'_thumbs/'``. * All templates and examples have been converted to the new ``{% url %}`` syntax. * Custom comment models are now supported in the ``CommentsContent``. * Media files are now removed from the disk too if a media file entry is removed from the database. * The modules :mod:`feincms.module.page.models` and :mod:`feincms.module.medialibrary.models` have been split up. Admin code has been moved into ``modeladmin.py`` files, form code into ``forms.py``. Bugfixes ======== * The core page methods support running with ``APPEND_SLASH = False`` now. Many content types using forms do not, however. * The MPTT attributes aren't hardcoded in the tree editor anymore. Custom names for the ``left``, ``right``, ``level`` and ``tree_id`` attributes are now supported. Models which do not use ``id`` as their primary key are supported now as well. * FeinCMS uses timezone-aware datetimes now. ��������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/releases/1.7.rst�����������������������������������������������������������������0000664�0000000�0000000�00000012405�12122555434�0016746�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������========================= FeinCMS 1.7 release notes ========================= Welcome to FeinCMS 1.7! Extensions-mechanism refactor ============================= The extensions mechanism has been refactored to remove the need to make models know about their related model admin classes. The new module :py:mod:`feincms.extensions` contains mixins and base classes - their purpose is as follows: :ref:`extensions`. View code refactor ================== Made views, content type and request / response processors reusable. The legacy views at :py:mod:`feincms.views.legacy` were considered unhelpful and were removed. Backwards-incompatible changes ============================== Page manager methods behavior ----------------------------- Previously, the following page manager methods sometimes returned inactive objects or did not raise the appropriate (and asked for) :py:class:`~django.http.Http404` exception: - ``Page.objects.page_for_path`` - ``Page.objects.best_match_for_path`` - ``Page.objects.for_request`` The reason for that was that only the page itself was tested for activity in the manager method, and none of its ancestors. The check whether all ancestors are active was only conducted later in a request processor. This request processor was registered by default and was always run when ``Page.objects.for_request`` was called with ``setup=True``. However, request processors do not belong into the model layer. The necessity of running code belonging to a request-response cycle to get the correct answer from a manager method was undesirable. This has been rectified, those manager methods check the ancestry directly. The now redundant request processor ``require_path_active_request_processor`` has been removed. Reversing application content URLs ---------------------------------- The support for monkey-patching applicationcontent-awareness into Django's :py:func:`django.core.urlresolvers.reverse` has been removed. Removal of deprecated features ------------------------------ * The old media library content type module :py:mod:`feincms.content.medialibrary.models` has been replaced with the contents of :py:mod:`feincms.content.medialibrary.v2`. The model field ``position`` has been renamed to ``type``, instead of ``POSITION_CHOICES`` you should use ``TYPE_CHOICES`` now. The code has been simplified and hacks to imitate ``raw_id_fields`` have been replaced by working stock code. The ``v2`` module will stay around for another release and will be removed in FeinCMS v1.8. The now-unused template ``admin/content/mediafile/init.html`` has been deleted. New deprecations ---------------- * ``Page.setup_request()`` does not do anything anymore and will be removed in FeinCMS v1.8. Notable features and improvements ================================= * A lazy version of :py:func:`~feincms.content.application.models.app_reverse` is now available, :py:func:`~feincms.content.application.models.app_reverse_lazy`. * Because of the extensions refactor mentioned above, all ``register_extension`` methods have been removed. Additionally, the model admin classes are not imported inside the ``models.py`` files anymore. * The setting ``FEINCMS_USE_PAGE_ADMIN`` can be set to false to prevent registration of the page model with the administration. This is especially useful if you only want to reuse parts of the page module. * Various classes in :py:mod:`feincms.module.page` do not hardcode the page class anymore; hooks are provided to use your own models instead. Please refer to the source for additional information. * ``Page.redirect_to`` can also contain the primary key of a page now, which means that the redirect target stays correct even if the page URL changes. * Before, page content was copied automatically when creating a translation of an existing page. This behavior can be deactivated by unchecking a checkbox now. * Work has begun to make the page forms, model admin classes and managers work with an abstract page model so that it will be easier to work with several page models in a single Django site. Bugfixes ======== * It should be possible to store FeinCMS models in a secondary database, as long as the base model and all content types are stored in the same database. * Changing templates in the item editor where the templates do not share common regions does not result in orphaned content blocks anymore. * :py:func:`feincms.utils.get_object` knows how to import modules, not only objects inside modules now. * The order and priority values for pages have been fixed when generating sitemaps. * Various ``save`` and ``delete`` methods now come with ``alters_data=True`` to prevent their use in templates. * Only one translation is permitted per language when using :py:mod:`feincms.translations`. * FeinCMS can now be used without :py:mod:`django.contrib.sites`. * If the fieldset of a content inline has been customized, the fieldset is not processed again to make sure that all form fields are actually shown. If you use dynamically generated fields in a content inline such as the application content does, you must not customize the fieldsets attribute of the ``FeinCMSInline``. Compatibility with Django and other apps ======================================== FeinCMS 1.7 requires Django 1.4 or better. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/templatetags.rst�����������������������������������������������������������������0000664�0000000�0000000�00000016531�12122555434�0017334�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _templatetags: ============= Template tags ============= General template tags ===================== .. module:: feincms.templatetags.feincms_tags To use the template tags described in this section, you need to load the ``feincms_tags`` template tag library:: {% load feincms_tags %} .. function:: feincms_render_region: .. function:: feincms_render_content: Some content types will need the request object to work properly. Contact forms will need to access POSTed data, a Google Map content type needs to use a different API key depending on the current domain etc. This means you should add ``django.core.context_processors.request`` to your ``TEMPLATE_CONTEXT_PROCESSORS``. These two template tags allow you to pass the request from the template to the content type. :func:`feincms_render_content` allows you to surround the individual content blocks with custom markup, :func:`feincms_render_region` simply concatenates the output of all content blocks:: {% load feincms_tags %} {% feincms_render_region feincms_page "main" request %} or:: {% load feincms_tags %} {% for content in feincms_page.content.main %} <div class="block"> {% feincms_render_content content request %} </div> {% endfor %} Both template tags add the current rendering context to the ``render`` method call too. This means that you can access both the request and the current context inside your content type as follows:: class MyContentType(models.Model): # class Meta etc... def render(self, **kwargs): request = kwargs.get('request') context = kwargs.get('context') .. function:: feincms_frontend_editing: Page module-specific template tags ================================== .. module:: feincms.module.page.templatetags.feincms_page_tags All page module-specific template tags are contained in ``feincms_page_tags``:: {% load feincms_page_tags %} .. function:: feincms_nav: Return a list of pages to be used for the navigation level: 1 = toplevel, 2 = sublevel, 3 = sub-sublevel depth: 1 = only one level, 2 = subpages too If you set depth to something else than 1, you might want to look into the ``tree_info`` template tag from the mptt_tags library. Example:: {% load feincms_page_tags %} {% feincms_nav feincms_page level=2 depth=1 as sublevel %} {% for p in sublevel %} <a href="{{ p.get_absolute_url }}">{{ p.title }}</a> {% endfor %} This template tag has replaced ``feincms_navigation``, which used a hand-grown parser and had several bugs which were hard to fix without a complete rewrite. .. function:: siblings_along_path_to: This is a filter designed to work in close conjunction with the ``feincms_navigation`` template tag describe above to build a navigation tree following the path to the current page. Example:: {% feincms_navigation of feincms_page as navitems level=1,depth=3 %} {% with navitems|siblings_along_path_to:feincms_page as navtree %} {% recursetree navtree %} * {{ node.short_title }} <br> {% if children %} <div style="margin-left: 20px">{{ children }}</div> {% endif %} {% endrecursetree %} {% endwith %} For helper function converting a tree of pages into an HTML representation please see the mptt_tags library's ``tree_info`` and ``recursetree``. .. function:: feincms_parentlink: Return a link to an ancestor of the passed page. You'd determine the link to the top level ancestor of the current page like this:: {% load feincms_page_tags %} {% feincms_parentlink of feincms_page level=1 %} Please note that this is not the same as simply getting the URL of the parent of the current page. .. function:: feincms_languagelinks: This template tag needs the translations extension. Arguments can be any combination of: * ``all`` or ``existing``: Return all languages or only those where a translation exists * ``excludecurrent``: Excludes the item in the current language from the list The default behavior is to return an entry for all languages including the current language. Example:: {% load feincms_page_tags %} {% feincms_languagelinks for feincms_page as links all,excludecurrent %} {% for key, name, link in links %} <a href="{% if link %}{{ link }}{% else %}/{{ key }}/{% endif %}">{% trans name %}</a> {% endfor %} .. function:: feincms_translatedpage: This template tag needs the translations extension. Returns the requested translation of the page if it exists. If the language argument is omitted the primary language will be returned (the first language specified in settings.LANGUAGES):: {% load feincms_page_tags %} {% feincms_translatedpage for feincms_page as feincms_transpage language=en %} {% feincms_translatedpage for feincms_page as originalpage %} {% feincms_translatedpage for some_page as translatedpage language=feincms_page.language %} .. function:: feincms_translatedpage_or_base: This template tag needs the translations extensions. Similar in function and arguments to feincms_translatedpage, but if no translation for the requested language exists, the base language page will be returned:: {% load feincms_page_tags %} {% feincms_translatedpage_or_base for some_page as some_transpage language=gr %} .. function:: feincms_breadcrumbs: :: {% load feincms_page_tags %} {% feincms_breadcrumbs feincms_page %} .. function:: is_parent_of: :: {% load feincms_page_tags %} {% if page1|is_parent_of:page2 %} page1 is a parent of page2 {% endif %} .. function:: is_equal_or_parent_of: :: {% load feincms_page_tags %} {% feincms_navigation of feincms_page as main level=1 %} {% for entry in main %} <a {% if entry|is_equal_or_parent_of:feincms_page %}class="mark"{% endif %} href="{{ entry.get_absolute_url }}">{{ entry.title }}</a> {% endfor %} Application content template tags ================================= .. module:: feincms.templatetags.applicationcontent_tags: .. function:: app_reverse: Returns an absolute URL for applications integrated with ApplicationContent The tag mostly works the same way as Django's own {% url %} tag:: {% load applicationcontent_tags %} {% app_reverse "mymodel_detail" "myapp.urls" arg1 arg2 %} or:: {% load applicationcontent_tags %} {% app_reverse "mymodel_detail" "myapp.urls" name1=value1 name2=value2 %} The first argument is a path to a view. The second argument is the URLconf under which this app is known to the ApplicationContent. Other arguments are space-separated values that will be filled in place of positional and keyword arguments in the URL. Don't mix positional and keyword arguments. If you want to store the URL in a variable instead of showing it right away you can do so too:: {% app_reverse "mymodel_detail" "myapp.urls" arg1 arg2 as url %} .. function:: fragment: .. function:: get_fragment: Don't use those, read up on :ref:`integration-applicationcontent-inheritance20` instead. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/docs/versioning.rst�������������������������������������������������������������������0000664�0000000�0000000�00000003247�12122555434�0017025�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _versioning: ===================================================== Versioning database content with ``django-reversion`` ===================================================== The following steps should be followed to integrate the page module with django-reversion_: .. _django-reversion: https://github.com/etianen/django-reversion * Add ``'reversion'`` to the list of installed applications. * Add ``'reversion.middleware.RevisionMiddleware'`` to ``MIDDLEWARE_CLASSES``. * Call ``Page.register_with_reversion()`` after all content types have been created (after all ``create_content_type`` invocations). Now, you need to create your own model admin subclass inheriting from both FeinCMS' ``PageAdmin`` and from reversions ``VersionAdmin``:: from django.contrib import admin from feincms.module.page.models import Page, PageAdmin from reversion.admin import VersionAdmin admin.site.unregister(Page) class VersionedPageAdmin(PageAdmin, VersionAdmin): pass admin.site.register(Page, VersionedPageAdmin) The ``VersionedPageAdmin`` does not look like the ItemEditor -- it's just raw Django inlines, without any additional JavaScript. Patches are welcome, but the basic functionality needed for versioning page content is there. Finally, you should ensure that initial revisions are created using ``django-reversion``'s ``createinitialrevisions`` management command. .. note:: You should ensure that you're using a reversion release which is compatible with your installed Django version. The reversion documentation contains an up-to-date list of compatible releases. The reversion support in FeinCMS requires at least django-reversion 1.6. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0014605�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/README������������������������������������������������������������������������0000664�0000000�0000000�00000000166�12122555434�0015470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������This is a really basic example how to use FeinCMS. Username/Password for the admin interface are admin and password. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/__init__.py�������������������������������������������������������������������0000664�0000000�0000000�00000000000�12122555434�0016704�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/admin.py����������������������������������������������������������������������0000664�0000000�0000000�00000000515�12122555434�0016250�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.contrib import admin from feincms.admin import tree_editor from example.models import Category class CategoryAdmin(tree_editor.TreeEditor): list_display = ('name', 'slug') list_filter = ('parent',) prepopulated_fields = { 'slug': ('name',), } admin.site.register(Category, CategoryAdmin) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/blog_urls.py������������������������������������������������������������������0000664�0000000�0000000�00000000630�12122555434�0017146�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.conf.urls import patterns, include, url from django.views import generic from feincms.module.blog.models import Entry urlpatterns = patterns('', url(r'^(?P<pk>\d+)/', generic.DetailView.as_view( queryset=Entry.objects.all(), ), name='blog_entry_details'), url(r'^$', generic.ListView.as_view( queryset=Entry.objects.all(), ), name='blog_entry_list'), ) ��������������������������������������������������������������������������������������������������������feincms-1.7.4/example/example.db��������������������������������������������������������������������0000664�0000000�0000000�00000274000�12122555434�0016552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������SQLite format 3���@ �����^�����������`�������������������������������������������������-�������[�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1E�indexsqlite_autoindex_auth_user_1auth_user !!ctableauth_groupauth_groupCREATE TABLE "auth_group" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(80) NOT NULL UNIQUE )3G!�indexsqlite_autoindex_auth_group_1auth_group++Stableauth_permissionauth_permissionCREATE TABLE "auth_permission" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(50) NOT NULL, "content_type_id" integer NOT NULL, "codename" varchar(100) NOT NULL, UNIQUE ("content_type_id", ���YF���PA��� ���G=���B7���<3���:0���7-���0(���&$���V������������ ����������>lDmE)����j�J�����������������)!Can add region add_region)�5+Can delete log entrydelete_logentry)�5+Can change log entrychange_logentry#�/%Can add log entryadd_logentry �+#Can delete sitedelete_site �+#Can change sitechange_site�%Can add siteadd_site&�1)Can delete sessiondelete_session&�1)Can change sessionchange_session �+#Can add sessionadd_session/�;1Can delete content typedelete_contenttype/�;1Can change content typechange_contenttype) �5+Can add content typeadd_contenttype& �1)Can delete messagedelete_message& �1)Can change messagechange_message �+#Can add messageadd_message �+#Can delete userdelete_user �+#Can change userchange_user�%Can add useradd_user"�-%Can delete groupdelete_group"�-%Can change groupchange_group�'Can add groupadd_group,�7/Can delete permissiondelete_permission,�7/Can change permissionchange_permission&�1)Can add permission���D���(0���'�������3vdR@+�q_L6 u`H0��������j��������/delete_rawcontent-/change_rawcontent,)add_rawcontent+%delete_entry*%change_entry)add_entry(3 delete_imagecontent'3 change_imagecontent&- add_imagecontent%/ delete_rawcontent$/ change_rawcontent#) add_rawcontent"# delete_page!# change_page  add_page+ delete_template+ change_template% add_template' delete_region' change_region! add_region+delete_logentry+change_logentry%add_logentry#delete_site#change_siteadd_site)delete_session)change_session#add_session1delete_contenttype1change_contenttype+add_contenttype )delete_message )change_message #add_message #delete_user #change_useradd_user%delete_group%change_groupadd_group/delete_permission/change_permi���2- add_imagecontent% �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���q�q�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  � /sAAadminadmin@example.comsha1$1f44f$38f470646a94a83eb3a1a99cc9e49474c243c2662011-04-06 14:02:32.6683112009-06-16 03:26:20.738286 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ admin ������0o3�������������++Stableauth_permissionauth_permissionCREATE TABLE "auth_permission" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(50) NOT NULL, "content_type_id" integer NOT NULL, "codename" varchar(100) NOT NULL, UNIQUE ("content_type_id", "codename") )=Q+�indexsqlite_autoindex_auth_permission_1auth_permission !!ctableauth_groupauth_groupCREATE TABLE "auth_group" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(80) NOT NULL UNIQUE )3G!�indexsqlite_autoindex_auth_group_1auth_groupJctableauth_userauth_userCREATE TABLE "auth_user" ( "id" integer NOT NULL PRIMARY KEY, "username" varchar(30) NOT NULL UNIQUE, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL, "email" varchar(75) NOT NULL, "password" varchar(128) NOT NULL, "is_staff" bool NOT NULL, "is_active" bool NOT NULL, "is_superuser" bool NOT NULL, "last_login" datetime NOT NULL, "date_joined" datetime NOT NULL ) ������������������������������������������������������������������������������������������������������������������������������������������������������D 1E�indexsqlite_autoindex_auth_user_1auth_userE%%Mtableauth_messageauth_message CREATE TABLE "auth_message" ( "id" integer NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "auth_user" ("id"), "message" text NOT NULL )33Ctabledjango_content_typedjango_content_type CREATE TABLE "django_content_type" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "app_label" varchar(100) NOT NULL, "model" varchar(100) NOT NULL, UNIQUE ("app_label", "model") )E Y3�indexsqlite_autoindex_django_content_type_1django_content_type D ))Ctabledjango_sessiondjango_session CREATE TABLE "django_session" ( "session_key" varchar(40) NOT NULL PRIMARY KEY, "session_data" text NOT NULL, "expire_date" datetime NOT NULL ); O)�indexsqlite_autoindex_django_session_1django_session ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������|_The page "Blo���hMThe entry���W+The entry "New blog entry" was added successfully. You may edit it again below. �W�vYE(lP2 W66�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!!test modelexampletestmodel.�31application contentpageapplicationcontent;�9%5media file translationmedialibrarymediafiletranslation$�!%media filemedialibrarymediafile!�%categorymedialibrarycategory#�!-media filepagemediafilecontent�categoryexamplecategory�%imageblogimagecontent�#!raw contentblograwcontent�entryblogentry �%imagepageimagecontent �#!raw contentpagerawcontent �pagepagepage �templatefeincmstemplate �regionfeincmsregion�log entryadminlogentry�sitesitessite�sessionsessionssession(�%%#content typecontenttypescontenttype���messageauthmessage�userauthuser�groupauthgroup�!!permissionauthpermission �+�jWBmG+ 4 }}}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������exampletestmodel1pageapplicationcontent%%5medialibrarymediafiletranslation%medialibrarymediafile%medialibrarycategory-pagemediafilecontentexamplecategory%blogimagecontent!blograwcontentblogentry%pageimagecontent !pagerawcontent pagepage feincmstemplate feincmsregion adminlogentrysitessitesessionssession%#contenttypescontenttype���authmessage authuserauthgroup!authpermission ����q�cj�q�"������������������HMQA12c0c0c8f4f31453bf2859335d98fb1eNTJjOGM4OTU3NjJjMWM0ODY3OTY1ODdiYWNlNTgvM{A12c0c0c8f4f31453bf2859335d98fb1eMjA1NGRlMGJhMDI0NjAzNjhlMGI3ZDdlOWIzMDI4Mjg0ZTMzMmMzYzqAAn1xAShVEl9hdXRoX3Vz ZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHED VQ1fYXV0aF91c2VyX2lkcQRLAXUu 2011-04-20 14:02:32.672344vM{Ab693c85b35e414a40fb61b88f126bd69MjA1NGRlMGJhMDI0NjAzNjhlMGI3ZDdlOWIzMDI4Mjg0ZTMzMmMzYzqAAn1xAShVEl9hdXRoX3Vz ZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHED VQ1fYXV0aF91c2VyX2lkcQRLAXUu 2011-04-20 12:28:29.906679!MQA84026bfb69bd2492c0a4d7f2f7ae9898NTJjOGM4OTU3NjJjMWM0ODY3OTY1ODdiYWNlNTgzNWU2Y2VlMTZiOTqAAn1xAVUKdGVzdGNvb2tp ZXECVQZ3b3JrZWRxA3Mu 2011-04-20 10:54:27.447075vM{Acb10420cd048a42e80102a442e2fb573MjA1NGRlMGJhMDI0NjAzNjhlMGI3ZDdlOWIzMDI4Mjg0ZTMzMmMzYzqAAn1xAShVEl9hdXRoX3Vz ZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHED VQ1fYXV0aF91c2VyX2lkcQRLAXUu 2011-04-20 06:31:01.013979 �G�Gl�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$M12c0c0c8f4f31453bf2859335d98fb1e$Mb693c85b35e414a40fb61b88f126bd69���%ccf9f2d931f08f6f25b06b087b9c9f43$Mcb10420cd048a42e80102a442e2fb573$M84026bfb69bd2492c0a4d7f2f7ae9898 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)localhost:8001site2�)localhost:8000site1te1 �������t, ##tabledjango_sitedjango_siteCREATE TABLE "django_site" ( "id" integer NOT NULL PRIMARY KEY, "domain" varchar(100) NOT NULL, "name" varchar(50) NOT NULL )1 --tabledjango_admin_logdjango_admin_logCREATE TABLE "django_admin_log" ( "id" integer NOT NULL PRIMARY KEY, "action_time" datetime NOT NULL, "user_id" integer NOT NULL REFERENCES "auth_user" ("id"), "content_type_id" integer REFERENCES "django_content_type" ("id"), "object_id" text, "object_repr" varchar(200) NOT NULL, "action_flag" smallint unsigned NOT NULL, "change_message" text NOT NULL )<99tableauth_group_permissionsauth_group_permissionsCREATE TABLE "auth_group_permissions" ( "id" integer NOT NULL PRIMARY KEY, "group_id" integer NOT NULL REFERENCES "auth_group" ("id"), "permission_id" integer NOT NULL REFERENCES "auth_permission" ("id"), UNIQUE ("group_id", "permission_id") )K_9�indexsqlite_autoindex_auth_group_permissions_1auth_group_permissions�������^r>o<��p�=���������������������1 �A! 2009-09-03 16:46:17.8828961Category 1R �Ac 2009-09-02 14:55:32.239511 6  Test page 2 wants a subpage tooB �AC 2009-09-02 14:55:03.195165 5  Another subpage2 �A# 2009-09-02 14:54:42.279412 4Test Page 31 �A! 2009-06-30 16:02:17.8334622Category 21 �A! 2009-06-30 16:02:14.7697821Category 1b �A 2009-06-30 15:57:39.8176361This is a news entry... just for testing the functionality6 �A+ 2009-06-26 05:12:56.975423 3Maybe a subpage2 �A# 2009-06-26 05:12:28.839559 2Test page 22 �A# 2009-06-26 05:11:40.512430 1Test page 1D �AG 2009-06-16 04:09:24.038524 3Another page (/another-page/)8 �A/ 2009-06-16 03:33:47.142288 2Really (/really/)> �A; 2009-06-16 03:33:31.877106 1Something (/something/)4 �A' 2009-06-16 03:31:22.306204 1Base Template. �A 2009-06-16 03:31:10.521889 2Sidebar2 �A# 2009-06-16 03:31:03.386898���U/���R!���Q �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���\�\wk�%�����������������K+;indexauth_permission_content_type_idauth_permissionCREATE INDEX "a--ctableauth_user_groupsauth_user_groupsCREATE TABLE "auth_user_groups" ( "id" integer NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "auth_user" ("id"), "group_id" integer NOT NULL REFERENCES "auth_gr--ctableauth_user_groupsauth_user_groupsCREATE TABLE "auth_user_groups" ( "id" integer NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "auth_user" ("id"), "group_id" integer NOT NULL REFERENCES "auth_group" ("id"), UNIQUE ("user_id", "group_id") )?S-�indexsqlite_autoindex_auth_user_groups_1auth_user_groupsEAAtableauth_user_user_permissionsauth_user_user_permissionsCREATE TABLE "auth_user_user_permissions" ( "id" integer NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "auth_user" ("id"), "permission_id" integer NOT NULL REFERENCES "auth_permission" ("id"), UNIQUE ("user_id", "permission_id") ) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �?t�|vpjd^XRLF@:4.(" ztbbbbbb���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������E� D�CBA@?>=<;:9876543210/.-,+*)( ' & % $ # " !         ��� ���  ���   ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� ����wg����ctablepage_pagepage_pageCREATE TABLE "page_page" ( "id" integer NOT NULL PRIMARY KEY, "active" bool NOT NULL, "title" varchar(100) NOT NULL, "slug" varchar(50) NOT NULL, "parent_id" integer, "in_navigation" bool NOT NULL, "override_url" varchar(200) NOT NULL, "redirect_to" varchar(200) NOT NULL, "_cached_url" varchar(200) NOT NULSgA�indexsqlite_autoindex_auth_user_user_permissions_1auth_user_user_permissionsK+;indexauth_permission_content_type_idauth_permissionCREATE INDEX "auth_permission_content_type_id" ON "auth_permission" ("content_type_id")n5%indexauth_message_user_idauth_messageCREATE INDEX "auth_message_user_id" ON "auth_message" ("user_id")~=-indexdjango_admin_log_user_iddjango_admin_logCREATE INDEX "django_admin_log_user_id" ON "django_admin_log" ("user_id")M-?indexdjango_admin_log_content_type_iddjango_admin_logCREATE INDEX "django_admin_log_content_type_id" ON "django_admin_log" ("content_type_id") ���8�|vpjd^XRLF@:4.(" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������876543210/.-,+*)('&%$#"!       ���8�:RL@4.(" F|vpjd^X���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� 8 7 6 5 4 3 210/.- , + * )( ' & % $ # "!                   ��� ��u4_D���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#N �-' 5�Subage on Site 2subage-site-2 /root/subage-site-2/baseB �1� �Homepage on Site 2homepage/root//root/�base;�1#� �Homepage on Site 1test-page-1//��baseW�� gBlogblog/blog/�baseexample.models.BlogEntriesNavigationExtension?�##� '�Test Page 4test-page-4/test-page-4/�base�KG c�Test page 2 wants a subpage tootest-page-2-wants-subpage-too/test-page-2/test-page-2-wants-subpage-too/baseL�++ /�Another subpageanother-subpage/another-subpage/base?�##� '�Test Page 3test-page-3/test-page-3/�baseH�+' +�Maybe a subpagemaybe-subpage/maybe-subpage/base?�##� '�Test page 2test-page-2/test-page-2/��base f��>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,�M<h2>Another toplevel!! page</h2>main�&�A... with some content, toomain����,I<h2>Another toplevel page</h2>main��-Sidebar's great.sidebar�K� <h2>Some content</h2> <p>A <strong>bit</strong> more...</p>main� ����D��D&��������������������������������������������������{tablepage_pagepage_pageCREATE TABLE "page_page" ( "id" integer NOT NULL PRIMARY KEY, "active" bool NOT NULL, "title" varchar(100) NOT NULL, "slug" varchar(50) NOT NULL, "parent_id" integer, "in_navigation" bool NOT NULL, "override_url" varchar(200) NOT NULL, "redirect_to" varchar(200) NOT NULL, "_cached_url" varchar(200) NOT NULL, "lft" integer unsigned NOT NULL, "rght" integer unsigned NOT NULL, "tree_id" integer unsigned NOT NULL, "level" integer unsigned NOT NULL, "template_key" varchar(20) NOT NULL , navigation_extension varchar(200), site_id integer NULL REFERENCES "django_site" ("id")) 55ctablepage_page_rawcontentpage_page_rawcontentCREATE TABLE "page_page_rawcontent" ( "id" integer NOT NULL PRIMARY KEY, "text" text NOT NULL, "parent_id" integer NOT NULL REFERENCES "page_page" ("id"), "region" varchar(20) NOT NULL, "ordering" integer NOT NULL ) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� P�obPx����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'subage-site-2 homepage blog#test-page-4!Gtest-page-2-wants-subpage-too+another-subpage#test-page-3'maybe-subpage#test-page-2#test-page-1 ��� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������ � 4XM4p^������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5/root/subage-site-2/ /root/ /'/test-page-4//c/test-page-2/test-page-2-wants-subpage-too///another-subpage/'/test-page-3/+/maybe-subpage/'/test-page-2/ /blog/a���/ ��� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �� ����q��q�"z�m�$� �������#M9?indexpage_page_imagecontent_parent_idpage_page_imagecontent-CRE���U'sindexpage_page_lftpage_page%CREATE INDEX "page_page_lft" ON "page_page" ("lft")X)windexpage_page_rghtpage_page)CREATE INDEX "page_page_rght" ON "page_page" ("rght")b /indexpage_page_tree_idpage_page*CREATE INDEX "page_page_tree_id" ON "page_page" ("tree_id")[!+{indexpage_page_levelpage_page+CREATE INDEX "page_page_level" ON "page_page" ("level")"I57indexpage_page_rawcontent_parent_idpage_page_rawcontent,CREATE INDEX "page_page_rawcontent_parent_id" ON "page_page_rawcontent" ("parent_id")#M9?indexpage_page_imagecontent_parent_idpage_page_imagecontent-CREATE INDEX "page_page_imagecontent_parent_id" ON "page_page_imagecontent" ("parent_id")d$!!tableblog_entryblog_entry.CREATE TABLE "blog_entry" ( "id" integer NOT NULL PRIMARY KEY, "published" bool NOT NULL, "title" varchar(100) NOT NULL, "slug" varchar(50) NOT NULL, "published_on" datetime ) D��J�|^:mE)����j�J�J�J�J�����������������)!Can add region add_region)�5+Can delete log entrydelete_logentry)�5+Can change log entrychange_logentry#�/%Can add log entryadd_logentry �+#Can delete sitedelete_site �+#Can change sitechange_site�%Can add siteadd_site&�1)Can delete sessiondelete_session&�1)Can change sessionchange_session �+#Can add sessionadd_session/�;1Can delete content typedelete_contenttype/�;1Can change content typechange_contenttype) �5+Can add content typeadd_contenttype���r1)Can delete messagedelete_message���J1)Can change messagechange_message���"+#Can add messageadd_message �+#Can delete userdelete_user �+#Can change userchange_user�%Can add useradd_user"�-%Can delete groupdelete_group"�-%Can change groupchange_group�'Can add groupadd_group,�7/Can delete permissiondelete_permission,�7/Can change permissionchange_permission&�1)Can add permissionadd_permission ����r��r��� 6RtBm'V�N����������������������"1�-%Can add categoryadd_category$�/'Can change region change_region$�/'Can delete region delete_region"�-%Can add template add_template(�3+Can change template change_template(�3+Can delete template delete_template�%Can add page add_page �+#Can change page change_page !�+#Can delete page delete_page'"�3)Can add raw content add_rawcontent-#�9/Can change raw content change_rawcontent-$�9/Can delete raw content delete_rawcontent#%�'-Can add image add_imagecontent)&�-3Can change image change_imagecontent)'�-3Can delete image delete_imagecontent(�'Can add entryadd_entry")�-%Can change entrychange_entry"*�-%Can delete entrydelete_entry'+�3)Can add raw contentadd_rawcontent-,�9/Can change raw contentchange_rawcontent--�9/Can delete raw contentdelete_rawcontent#.�'-Can add imageadd_imagecontent)/�-3Can change imagechange_imagecontent)0�-3Can delete imagedelete_imagecontent ��� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ��� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ��� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���L�L����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������6�))3New blog entrynew-blog-entry2010-01-05 16:11:57z�W3This is a news entry... just for testing the functionalitynews-entry-just-testing-functionality2009-06-30 15:57:39 ���2�2������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������K� Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.main� ����0��0{��������������������������������-&;;qtableblog_entry_imagecontentblog_entry_imagecontent1CREATE TABLE "blog_entry_imagecontent" ( "id" integer NOT NULL PRIMARY KEY, "image" varchar(100) NOT NULL, "parent_id" integer NOT NULL REFERENCES "blog_entry" ("id"), "region" varchar(20) NOT NULL, "ordering" integer NOT NULL, "position" varchar(10) NOT NULL , alt_text varchar(255) not null default '', caption varchar(255) not null default '')(K7;indexblog_entry_rawcontent_parent_idblog_entry_rawcontent5CREATE INDEX "blog_entry_rawcontent_parent_id" ON "blog_entry_rawcontent" ("parent_id")\'+!{indexblog_entry_slugblog_entry4CREATE INDEX "blog_entry_slug" ON "blog_entry" ("slug")$%77gtableblog_entry_rawcontentblog_entry_rawcontent/CREATE TABLE "blog_entry_rawcontent" ( "id" integer NOT NULL PRIMARY KEY, "text" text NOT NULL, "parent_id" integer NOT NULL REFERENCES "blog_entry" ("id"), "region" varchar(20) NOT NULL, "ordering" integer NOT NULL ) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �!0�0E]u0Ibt!5I\r��������j��������/delete_rawcontent-/change_rawcontent,)add_rawcontent+%delete_entry*%change_entry)add_entry(3 delete_imagecontent'3 change_imagecontent&- add_imagecontent%)add_permission/change_permission/delete_permissionadd_group%change_group%delete_groupadd_user#change_user#delete_user ���<add_message ���change_message ���delete_message +add_contenttype 1change_contenttype1delete_contenttype#add_session)change_session)delete_sessionadd_site#change_site#delete_site%add_logentry+change_logentry+delete_logentry! add_region' change_region' delete_region% add_template+ change_template+ delete_template add_page# change_page # delete_page!) add_rawcontent"/ change_rawcontent#/ delete_rawcontent$ ���/�Oi/I\r2I`/���*������h����������������9add_applicationcontent@!Cdelete_mediafiletranslation?!Cchange_mediafiletranslation>=add_mediafiletranslation=-���Bdelete_testmodelE���+change_testmodelD���add_testmodelC?delete_applicationcontentB3 change_imagecontent&3 delete_imagecontent'add_entry(%change_entry)%delete_entry*)add_rawcontent+/change_rawcontent,/delete_rawcontent--add_imagecontent.3change_imagecontent/3delete_imagecontent0%add_category1+change_category2+delete_category35add_mediafilecontent4;change_mediafilecontent5;delete_mediafilecontent6%add_category7+change_category8+delete_category9'add_mediafile:-change_mediafile;-delete_mediafile<=add_mediafiletranslation=!Cchange_mediafiletranslation>!Cdelete_mediafiletranslation?9add_applicationcontent@?change_applicationcontentA �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)new-blog-entry)Wnews-entry-just-testing-functionality ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����J��������������8,--#tableexample_categoryexample_category;CREATE TABLE "example_category" ( "id" integer NOT NULL PRIMARY KEY, "name��� )O;Cindexblog_entry_imagecontent_parent_idblog_entry_imagecontent6CREATE INDEX "blog_entry_imagecontent_parent_id" ON "blog_entry_imagecontent" ("parent_id")6*77 tableblog_entry_categoriesblog_entry_categories8CREATE TABLE "blog_entry_categories" ( "id" integer NOT NULL PRIMARY KEY, "entry_id" integer NOT NULL REFERENCES "blog_entry" ("id"), "category_id" integer NOT NULL REFERENCES "example_category" ("id"), UNIQUE ("entry_id", "category_id") )I+]7�indexsqlite_autoindex_blog_entry_categories_1blog_entry_categories9��2--#tableexample_categoryexample_category;CREATE TABLE "example_category" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(20) NOT NULL, "slug" varchar(50) NOT NULL )���w7-indexexample_category_slugexample_category<CREATE INDEX "example_category_slug" ON "example_category" ("slug") ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����rr�������������������������������������������������������������������������������������������������������������������������h/77otablemedialibrary_categorymedialibrary_category?CREATE TABLE "medialibrary_category" ( "id" integer NOT NULL PRIMARY KEY, "title" varchar(200) NOT NULL, "parent_id" integer , slug varchar(150) NOT NULL default '')&099gtablemedialibrary_mediafilemedialibrary_mediafile@CREATE TABLE "medialibrary_mediafile" ( "id" integer NOT NULL PRIMARY KEY, "file" varchar(100) NOT NULL, "type" varchar(12) NOT NULL, "created" datetime NOT NULL, "copyright" varchar(200) NOT NULL , file_size integer)��eAAOtablepage_page_mediafilecontentpage_page_mediafilecontent=CREATE TABLE "page_page_mediafilecontent" ( "id" integer NOT NULL PRIMARY KEY, "parent_id" integer NOT NULL REFERENCES "page_page" ("id"), "region" varchar(20) NOT NULL, "ordering" integer NOT NULL, "mediafile_id" integer NOT NULL, "position" varchar(10) NOT NULL ) ��pI"����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� c���������C���s���|�t��t�i�|���<d��S(���N(���t���MIMER���R��(���R���t���mimetype(����(����s.���/Library/Python/2.5/site-packages/PIL/Image.pyt ���reg# �%!�Category xyzcategory-2�% �%#Category 2.1category-21% �%#Category 2.2category-22% �%#Category 3.1category-31% �%#Category 1.1category-11% �%#Category 1.2category-12! �!!�Category 3category-3����#!!�Category 2category-2�! �!!�Category 1category-1� ������'���������������������������������������������������������������������������������������������������������������������������������������������������������������������������k1OOEtablemedialibrary_mediafiletranslationmedialibrary_mediafiletranslationACREATE TABLE "medialibrary_mediafiletranslation" ( "id" integer NOT NULL PRIMARY KEY, "parent_id" integer NOT NULL REFERENCES "medialibrary_mediafile" ("id"), "language_code" varchar(10) NOT NULL, "caption" varchar(200) NOT NULL , description text not null default '')s2OOUtablemedialibrary_mediafile_categoriesmedialibrary_mediafile_categoriesCCREATE TABLE "medialibrary_mediafile_categories" ( "id" integer NOT NULL PRIMARY KEY, "mediafile_id" integer NOT NULL REFERENCES "medialibrary_mediafile" ("id"), "category_id" integer NOT NULL REFERENCES "medialibrary_category" ("id"), UNIQUE ("mediafile_id", "category_id") )a3uO�indexsqlite_autoindex_medialibrary_mediafile_categories_1medialibrary_mediafile_categoriesD �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����|��|���"V)VI�L���������������������������������T7-Can change test modelchange_testmodel���"1�-%Can add categoryadd_category(2�3+Can change categorychange_category(3�3+Can delete categorydelete_category,4�15Can add media fileadd_mediafilecontent25�7;Can change media filechange_mediafilecontent26�7;Can delete media filedelete_mediafilecontent"7�-%Can add categoryadd_category(8�3+Can change categorychange_category(9�3+Can delete categorydelete_category%:�1'Can add media fileadd_mediafile+;�7-Can change media filechange_mediafile+<�7-Can delete media filedelete_mediafile<=�I=Can add media file translationadd_mediafiletranslationB>�OCCan change media file translationchange_mediafiletranslationB?�OCCan delete media file translationdelete_mediafiletranslation7@�C9Can add application contentadd_applicationcontent=A�I?Can change application contentchange_applicationcontent=B�I?Can delete application contentdelete_applicationcontent ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%Category 1.1�!�Category 3�!�Category 2�!�Category 1 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����555����������������������������,4UAOindexpage_page_mediafilecontent_parent_idpage_page_mediafilecontentECREATE INDEX "page_page_mediafilecontent_parent_id" ON "page_page_mediafilecontent" ("parent_id")s2OOUtablemedialibrary_mediafile_categoriesmedialibrary_medik1OOEtablemedialib���UAOindexpage_page_mediafilecontent_parent_idpage_page_mediafilecontentECREATE INDEX "page_page_mediafilecontent_parent_id" ON "page_page_mediafilecontent" ("parent_id")���[A[indexpage_page_mediafilecontent_mediafile_idpage_page_mediafilecontentFCREATE INDEX "page_page_mediafilecontent_mediafile_id" ON "page_page_mediafilecontent" ("mediafile_id")6K7;indexmedialibrary_category_parent_idmedialibrary_categoryHCREATE INDEX "medialibrary_category_parent_id" ON "medialibrary_category" ("parent_id")H7cOkindexmedialibrary_mediafiletranslation_parent_idmedialibrary_mediafiletranslationICREATE INDEX "medialibrary_mediafiletranslation_parent_id" ON "medialibrary_mediafiletranslation" ("parent_id") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������[���[������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ����(��( ��������������������l8-- tableexample_categoryexample_category;CREATE TABLE "example_category" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(20) NOT NULL, "slug" varchar(50) NOT NULL, "parent_id" integer, "lft" integer unsigned NOT NULL, "rght" integer unsigned NOT NULL, "tree_id" integer unsigned NOT NULL, "level" integer unsigned NOT NULL )u97-indexexample_category_slugexample_categoryJCREATE INDEX "example_category_slug" ON "example_category" ("slug"):A-'indexexample_category_parent_idexample_categoryKCREATE INDEX "example_category_parent_id" ON "example_category" ("parent_id")r;5-indexexample_category_lftexample_categoryLCREATE INDEX "example_category_lft" ON "example_category" ("lft")u<7-indexexample_category_rghtexample_categoryMCREATE INDEX "example_category_rght" ON "example_category" ("rght")~==-indexexample_category_tree_idexample_categoryNCREATE INDEX "example_category_tree_id" ON "example_category" ("tree_id") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#category-21#category-22#category-31#category-11#category-12!category-3!category-2!category-1 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����Q��Q�.���������������������������������������������������������������x>9-indexexample_category_levelexample_categoryOCREATE INDEX "example_category_level" ON "example_category" ("level")`?EECtablepage_page_applicationcontentpage_page_applicationcontentSCREATE TABLE "page_page_applicationcontent" ( "id" integer NOT NULL PRIMARY KEY, "parameters" text, "parent_id" integer NOT NULL REFERENCES "page_page" ("id"), "region" varchar(255) NOT NULL, "ordering" integer NOT NULL, "urlconf_path" varchar(100) NOT NULL )4@YEWindexpage_page_applicationcontent_parent_idpage_page_applicationcontentTCREATE INDEX "page_page_applicationcontent_parent_id" ON "page_page_applicationcontent" ("parent_id")A;;Gtableexample_testmodel_sitesexample_testmodel_sitesWCREATE TABLE "example_testmodel_sites" ( "id" integer NOT NULL PRIMARY KEY, "testmodel_id" integer NOT NULL, "site_id" integer NOT NULL REFERENCES "django_site" ("id"), UNIQUE ("testmodel_id", "site_id") ) ����=�f&r>o<��p�=���������������������1 �A! 2009-09-03 16:46:17.8828961Category 1R �Ac 2009-09-02 14:55:32.239511 6  Test page 2 wants a subpage tooB �AC 2009-09-02 14:55:03.195165 5  Another subpage2 �A# 2009-09-02 14:54:42.279412 4Test Page 31 �A! 2009-06-30 16:02:17.8334622Category 21 �A! 2009-06-30 16:02:14.7697821Category 1b �A 2009-06-30 15:57:39.8176361This is a news entry... just for testing the functionality6 �A+ 2009-06-26 05:12:56.975423 3Maybe a subpage2 �A# 2009-06-26 05:12:28.839559 2Test page 22 �A# 2009-06-26 05:11:40.512430 1Test page 1D �AG 2009-06-16 04:09:24.038524 3Another page (/another-page/)8 �A/ 2009-06-16 03:33:47.142288 2Really (/really/)> �A; 2009-06-16 03:33:31.877106 1Something (/something/)4 �A' 2009-06-16 03:31:22.306204 1Base Template. �A 2009-06-16 03:31:10.521889 2Sidebar2 �A# 2009-06-16 03:31:03.386898 1Main region ����d�X%U t@���d����������������������������������������������������������5! �A) 2011-04-06 06:31:38.2125672localhost:8000? �A#'2011-04-06 06:31:24.347527 1Test page 1Changed site.5 �A) 2010-01-05 09:11:59.1675232New blog entry+ �A 2010-01-05 08:44:04.775911 8Blog2 �A# 2009-10-08 12:06:12.066817 7Test Page 4@ �A%'2009-09-05 11:16:07.8703672Category xyzChanged name.3 �A% 2009-09-05 11:15:37.0702778Category 2.13 �A% 2009-09-05 11:15:30.1752627Category 2.23 �A% 2009-09-05 11:15:23.1866516Category 3.13 �A% 2009-09-03 16:47:33.2206675Category 1.13 �A% 2009-09-03 16:47:27.0133264Category 1.21 �A! 2009-09-03 16:47:19.4463203Category 31 �A! 2009-09-03 16:47:16.1316002Category 21 �A! 2009-09-03 16:47:12.7168441Category 1@ �A? 2009-09-03 16:46:34.8767784Category 1 - Category 1.11 �A! 2009-09-03 16:46:26.8464403Category 31 �A! 2009-09-03 16:46:22.9898652Category 2 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{}main�blog_urls ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����X�]QB���X����������������������������������������������������J/ �A/12011-04-07 05:17:54.9859192site2.example.comNo fields changed.J. �A/12011-04-07 05:17:53.6533762site2.example.comNo fields changed.P- �A/=2011-04-07 05:17:49.4386841site1.example.comChanged domain and name.D, �A#12011-04-07 05:07:03.542215 1Test page 1No fields changed.C+ �A!12011-04-07 03:46:22.534547 9site1 rootNo fields changed.A* �A#)2011-04-07 03:46:17.438742 10Site 2 rootChanged title.?) �A12011-04-07 03:46:08.732198 10dffdvNo fields changed.G( �A/+2011-04-07 03:45:55.7508082site2.example.comChanged domain.?' �A12011-04-06 14:03:08.228599 10dffdvNo fields changed.?& �A12011-04-06 14:02:51.346576 10dffdvNo fields changed.?% �A12011-04-06 12:33:22.028350 10dffdvNo fields changed.-$ �A 2011-04-06 12:32:47.006535 10dffdv1# �A! 2011-04-06 06:55:20.490326 9site1 root?" �A#'2011-04-06 06:31:44.782061 1Test page 1Changed site. ��� � &��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)99mtablepage_page_imagecontentpage_page_imagecontent!CREATE TABLE "page_page_imagecontent" ( "id" integer NOT NULL PRIMARY KEY, "image" varchar(100) NOT NULL, "parent_id" integer NOT NULL REFERENCES "page_page" ("id"), "region" varchar(20) NOT NULL, "ordering" integer NOT NULL, "position" varchar(10) NOT NULL , alt_text varchar(255) not null default '', caption varchar(255) not null default '')X)windexpage_page_slugpage_page"CREATE INDEX "page_page_slug" ON "page_page" ("slug")h3 indexpage_page_parent_idpage_page#CREATE INDEX "page_page_parent_id" ON "page_page" ("parent_id")n7indexpage_page__cached_urlpage_page$CREATE INDEX "page_page__cached_url" ON "page_page" ("_cached_url") ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����h��h�2s�������������������������������������������������������������������������������������MBa;�indexsqlite_autoindex_example_testmodel_sites_1example_testmodel_sitesXyC//!tableexample_testmodelexample_testmodelZCREATE TABLE "example_testmodel" ( "id" integer NOT NULL PRIMARY KEY )!DM;Gindexexample_testmodel_sites_1cc8037aexample_testmodel_sites\CREATE INDEX "example_testmodel_sites_1cc8037a" ON "example_testmodel_sites" ("testmodel_id")EK;;indexexample_testmodel_sites_6223029example_testmodel_sites]CREATE INDEX "example_testmodel_sites_6223029" ON "example_testmodel_sites" ("site_id") FAAtablepage_page_mediafilecontentpage_page_mediafilecontent=CREATE TABLE "page_page_mediafilecontent" ( "id" integer NOT NULL PRIMARY KEY, "mediafile_id" integer NOT NULL REFERENCES "medialibrary_mediafile" ("id"), "parent_id" integer NOT NULL REFERENCES "page_page" ("id"), "region" varchar(255) NOT NULL, "ordering" integer NOT NULL, "type" varchar(20) NOT NULL ) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����P���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*HSAMindexpage_page_mediafilecontent_63f17a16page_page_mediafilecontentFCREATE INDEX "page_page_mediafilecontent_63f17a16" ON "page_page_mediafilecontent" ("parent_id")-GSASindexpage_page_mediafilecontent_b6748209page_page_mediafilecontentECREATE INDEX "page_page_mediafilecontent_b6748209" ON "page_page_mediafilecontent" ("mediafile_id") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� �t2Z ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O8 �A-;2011-04-07 06:14:39.052140 11Subage on Site 2Changed title and slug.G7 �A-+2011-04-07 06:14:24.310003 11Supage on Site 2Changed active.86 �A- 2011-04-07 06:14:11.937419 11Supage on Site 2Q5 �A1;2011-04-07 06:13:07.907581 10Homepage on Site 2Changed title and slug.P4 �A1;2011-04-07 06:12:36.533295 1Homepage on Site 1Changed title and site.13 �A! 2011-04-07 06:12:32.361922 9site1 root@2 �A#'2011-04-07 05:48:57.446475 10Site 2 rootChanged site.D1 �A)+2011-04-07 05:48:21.8891472localhost:8001Changed domain.D0 �A)+2011-04-07 05:48:16.6353441localhost:8000Changed domain.feincms-1.7.4/example/manage.py���������������������������������������������������������������������0000775�0000000�0000000�00000000442�12122555434�0016412�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import os, sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'example.settings') from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/media/������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0015664�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/media/.gitignore��������������������������������������������������������������0000664�0000000�0000000�00000000002�12122555434�0017644�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������* ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/models.py���������������������������������������������������������������������0000664�0000000�0000000�00000005764�12122555434�0016456�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django import forms from django.db import models from django.utils.text import capfirst from django.utils.translation import ugettext_lazy as _ from mptt.models import MPTTModel from feincms.module.blog.models import Entry, EntryAdmin from feincms.module.page.models import Page from feincms.content.raw.models import RawContent from feincms.content.image.models import ImageContent from feincms.content.medialibrary.models import MediaFileContent from feincms.content.application.models import ApplicationContent from feincms.module.page.extensions.navigation import NavigationExtension, PagePretender from feincms.content.application.models import app_reverse Page.register_templates({ 'key': 'base', 'title': 'Base Template', 'path': 'base.html', 'regions': ( ('main', 'Main region'), ('sidebar', 'Sidebar', 'inherited'), ), }) Page.create_content_type(RawContent) Page.create_content_type(MediaFileContent, TYPE_CHOICES=( ('default', 'Default position'), )) Page.create_content_type(ImageContent, POSITION_CHOICES=( ('default', 'Default position'), )) def get_admin_fields(form, *args, **kwargs): return { 'exclusive_subpages': forms.BooleanField( label=capfirst(_('exclusive subpages')), required=False, initial=form.instance.parameters.get('exclusive_subpages', False), help_text=_('Exclude everything other than the application\'s content when rendering subpages.'), ), } Page.create_content_type(ApplicationContent, APPLICATIONS=( ('blog_urls', 'Blog', {'admin_fields': get_admin_fields}), )) Entry.register_regions( ('main', 'Main region'), ) Entry.create_content_type(RawContent) Entry.create_content_type(ImageContent, POSITION_CHOICES=( ('default', 'Default position'), )) class BlogEntriesNavigationExtension(NavigationExtension): """ Extended navigation for blog entries. It would be added to 'Blog' page properties in admin. """ name = _('all blog entries') def children(self, page, **kwargs): for entry in Entry.objects.all(): yield PagePretender( title=entry.title, url=app_reverse('blog_entry_details', 'blog_urls', kwargs={'pk': entry.id}), level=page.level + 1, ) Page.register_extensions( 'feincms.module.page.extensions.navigation', 'feincms.module.page.extensions.sites', ) class Category(MPTTModel): name = models.CharField(max_length=20) slug = models.SlugField() parent = models.ForeignKey('self', blank=True, null=True, related_name='children') class Meta: ordering = ['tree_id', 'lft'] verbose_name = 'category' verbose_name_plural = 'categories' def __unicode__(self): return self.name # add m2m field to entry so it shows up in entry admin Entry.add_to_class('categories', models.ManyToManyField(Category, blank=True, null=True)) EntryAdmin.list_filter += ('categories',) ������������feincms-1.7.4/example/settings.py�������������������������������������������������������������������0000664�0000000�0000000�00000003745�12122555434�0017030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Django settings for example project. import os DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( # ('Your Name', 'your_email@domain.com'), ) MANAGERS = ADMINS DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = os.path.join(os.path.dirname(__file__), 'example.db') DATABASES = {'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': DATABASE_NAME, }} TIME_ZONE = 'America/Chicago' LANGUAGE_CODE = 'en-us' SITE_ID = int(os.environ.get('SITE_ID', 1)) USE_I18N = True MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media/') MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static/') STATIC_URL = '/static/' SECRET_KEY = '_wn95s-apfd-442cby5m^_^ak6+5(fyn3lvnvtn7!si&o)1x^w' TEMPLATE_CONTEXT_PROCESSORS = ( 'django.contrib.auth.context_processors.auth', 'django.core.context_processors.debug', 'django.core.context_processors.i18n', 'django.core.context_processors.media', 'django.core.context_processors.request', 'django.core.context_processors.static', 'feincms.context_processors.add_page_if_missing', ) TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ) MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', ) ROOT_URLCONF = 'example.urls' TEMPLATE_DIRS = ( ) INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', 'django.contrib.staticfiles', 'feincms', 'feincms.module.blog', 'feincms.module.page', 'feincms.module.medialibrary', 'example', 'mptt', ) LANGUAGES = ( ('en', 'English'), ('de', 'German'), ) FEINCMS_TREE_EDITOR_INCLUDE_ANCESTORS = True ���������������������������feincms-1.7.4/example/templates/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0016603�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/templates/404.html������������������������������������������������������������0000664�0000000�0000000�00000000030�12122555434�0017771�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<h1>Page not found</h1> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/example/templates/base.html�����������������������������������������������������������0000664�0000000�0000000�00000005400�12122555434�0020402�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load applicationcontent_tags feincms_tags feincms_page_tags %} <html> <head> <title>{{ feincms_page.title }}

{{ feincms_page.title }}

Main content

{% block content %}{% feincms_render_region feincms_page "main" request %}{% endblock %}
{% feincms_frontend_editing feincms_page request %} {% get_fragment request "something" %} feincms-1.7.4/example/templates/blog/000077500000000000000000000000001212255543400175265ustar00rootroot00000000000000feincms-1.7.4/example/templates/blog/entry_detail.html000066400000000000000000000004271212255543400231020ustar00rootroot00000000000000{% load i18n %} {% load feincms_tags applicationcontent_tags %}

{{object.title}}

{% feincms_render_region object "main" request %}

{% trans "All entries" %}

feincms-1.7.4/example/templates/blog/entry_list.html000066400000000000000000000002731212255543400226120ustar00rootroot00000000000000{% load applicationcontent_tags %} {% for object in object_list %}

{{ object.title }}

{% endfor %} feincms-1.7.4/example/test_utils.py000066400000000000000000000022151212255543400173560ustar00rootroot00000000000000# -*- coding: utf-8 -*- from django.conf import settings from django.test.simple import DjangoTestSuiteRunner import coverage class CoverageRunner(DjangoTestSuiteRunner): def run_tests(self, *args, **kwargs): run_with_coverage = hasattr(settings, 'COVERAGE_MODULES') if run_with_coverage: coverage.use_cache(0) coverage.start() result = super(CoverageRunner, self).run_tests(*args, **kwargs) if run_with_coverage: coverage.stop() print '' print '----------------------------------------------------------------------' print ' Unit Test Code Coverage Results' print '----------------------------------------------------------------------' coverage_modules = [] for module in settings.COVERAGE_MODULES: coverage_modules.append(__import__(module, globals(), locals(), [''])) coverage.report(coverage_modules, show_missing=1) print '----------------------------------------------------------------------' return result feincms-1.7.4/example/urls.py000066400000000000000000000010161212255543400161420ustar00rootroot00000000000000import os from django.conf.urls import patterns, include, url from django.contrib import admin from django.contrib.staticfiles.urls import staticfiles_urlpatterns admin.autodiscover() urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls) ), url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': os.path.join(os.path.dirname(__file__), 'media/')}), url(r'', include('feincms.contrib.preview.urls')), url(r'', include('feincms.urls')) ) + staticfiles_urlpatterns() feincms-1.7.4/feincms/000077500000000000000000000000001212255543400145765ustar00rootroot00000000000000feincms-1.7.4/feincms/__init__.py000066400000000000000000000051501212255543400167100ustar00rootroot00000000000000VERSION = (1, 7, 4) __version__ = '.'.join(map(str, VERSION)) class LazySettings(object): def _load_settings(self): from feincms import default_settings from django.conf import settings as django_settings for key in dir(default_settings): if not key.startswith('FEINCMS_'): continue setattr(self, key, getattr(django_settings, key, getattr(default_settings, key))) def __getattr__(self, attr): self._load_settings() del self.__class__.__getattr__ return self.__dict__[attr] settings = LazySettings() COMPLETELY_LOADED = False def ensure_completely_loaded(force=False): """ This method ensures all models are completely loaded FeinCMS requires Django to be completely initialized before proceeding, because of the extension mechanism and the dynamically created content types. For more informations, have a look at issue #23 on github: http://github.com/feincms/feincms/issues#issue/23 """ global COMPLETELY_LOADED if COMPLETELY_LOADED and not force: return True # Ensure meta information concerning related fields is up-to-date. # Upon accessing the related fields information from Model._meta, # the related fields are cached and never refreshed again (because # models and model relations are defined upon import time, if you # do not fumble around with models like we do in FeinCMS.) # # Here we flush the caches rather than actually _filling them so # that relations defined after all content types registrations # don't miss out. from django.db.models import loading for model in loading.get_models(): for cache_name in ('_field_cache', '_field_name_cache', '_m2m_cache', '_related_objects_cache', '_related_many_to_many_cache', '_name_map'): try: delattr(model._meta, cache_name) except AttributeError: pass # Calls to get_models(...) are cached by the arguments used in the call. # This cache is normally cleared in loading.register_models(), but we # invalidate the get_models() cache, by calling get_models # above before all apps have loaded. (Django's load_app() doesn't clear the # get_models cache as it perhaps should). So instead we clear the # get_models cache again here. If we don't do this, Django 1.5 chokes on # a model validation error (Django 1.4 doesn't exhibit this problem). # See Issue #323 on github. loading.cache._get_models_cache.clear() COMPLETELY_LOADED = True return True feincms-1.7.4/feincms/_internal.py000066400000000000000000000025451212255543400171310ustar00rootroot00000000000000""" These are internal helpers. Do not rely on their presence. http://mail.python.org/pipermail/python-dev/2008-January/076194.html """ def monkeypatch_method(cls): """ A decorator to add a single method to an existing class:: @monkeypatch_method() def (self, [...]): pass """ def decorator(func): setattr(cls, func.__name__, func) return func return decorator def monkeypatch_property(cls): """ A decorator to add a single method as a property to an existing class:: @monkeypatch_property() def (self, [...]): pass """ def decorator(func): setattr(cls, func.__name__, property(func)) return func return decorator def monkeypatch_class(name, bases, namespace): """ A metaclass to add a number of methods (or other attributes) to an existing class, using a convenient class notation:: class (): __metaclass__ = monkeypatch_class def (...): ... def (...): ... ... """ assert len(bases) == 1, "Exactly one base class required" base = bases[0] for name, value in namespace.iteritems(): if name != "__metaclass__": setattr(base, name, value) return base feincms-1.7.4/feincms/admin/000077500000000000000000000000001212255543400156665ustar00rootroot00000000000000feincms-1.7.4/feincms/admin/__init__.py000066400000000000000000000000001212255543400177650ustar00rootroot00000000000000feincms-1.7.4/feincms/admin/editor.py000066400000000000000000000007741212255543400175360ustar00rootroot00000000000000import warnings warnings.warn("Accessing the item and tree editor through `feincms.admin.editor`" " has been deprecated. Please use `feincms.admin.item_editor` and" " `feincms.admin.tree_editor` instead. `feincms.admin.editor` will be" " removed in FeinCMS v1.8.", DeprecationWarning, stacklevel=2) from feincms.admin.item_editor import ItemEditor, ItemEditorForm from feincms.admin.tree_editor import TreeEditor, ajax_editable_boolean, \ ajax_editable_boolean_cell, django_boolean_icon feincms-1.7.4/feincms/admin/filterspecs.py000066400000000000000000000064211212255543400205660ustar00rootroot00000000000000# encoding=utf-8 # Thanks to http://www.djangosnippets.org/snippets/1051/ # # Authors: Marinho Brandao # Guilherme M. Gondim (semente) from django.contrib.admin.filters import FieldListFilter, ChoicesFieldListFilter from django.utils.encoding import smart_unicode from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ class ParentFieldListFilter(ChoicesFieldListFilter): """ Improved list_filter display for parent Pages by nicely indenting hierarchy In theory this would work with any mptt model which uses a "title" attribute. my_model_field.page_parent_filter = True """ def __init__(self, f, request, params, model, model_admin, field_path=None): from feincms.utils import shorten_string super(ParentFieldListFilter, self).__init__(f, request, params, model, model_admin, field_path) parent_ids = model.objects.exclude(parent=None).values_list("parent__id", flat=True).order_by("parent__id").distinct() parents = model.objects.filter(pk__in=parent_ids).values_list("pk", "title", "level") self.lookup_choices = [(pk, "%s%s" % (" " * level, shorten_string(title, max_length=25))) for pk, title, level in parents] def choices(self, cl): yield { 'selected': self.lookup_val is None, 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 'display': _('All') } for pk, title in self.lookup_choices: yield { 'selected': pk == int(self.lookup_val or '0'), 'query_string': cl.get_query_string({self.lookup_kwarg: pk}), 'display': mark_safe(smart_unicode(title)) } def title(self): return _('Parent') class CategoryFieldListFilter(ChoicesFieldListFilter): """ Customization of ChoicesFilterSpec which sorts in the user-expected format my_model_field.category_filter = True """ def __init__(self, f, request, params, model, model_admin, field_path=None): super(CategoryFieldListFilter, self).__init__(f, request, params, model, model_admin, field_path) # Restrict results to categories which are actually in use: self.lookup_choices = [ (i.pk, unicode(i)) for i in f.related.parent_model.objects.exclude(**{ f.related.var_name: None }) ] self.lookup_choices.sort(key=lambda i: i[1]) def choices(self, cl): yield { 'selected': self.lookup_val is None, 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 'display': _('All') } for pk, title in self.lookup_choices: yield { 'selected': pk == int(self.lookup_val or '0'), 'query_string': cl.get_query_string({self.lookup_kwarg: pk}), 'display': mark_safe(smart_unicode(title)) } def title(self): return _('Category') FieldListFilter.register(lambda f: getattr(f, 'parent_filter', False), ParentFieldListFilter, take_priority=True) FieldListFilter.register(lambda f: getattr(f, 'category_filter', False), CategoryFieldListFilter, take_priority=True) feincms-1.7.4/feincms/admin/item_editor.py000066400000000000000000000270451212255543400205540ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ import re import copy from django import forms, template from django.contrib import admin from django.db.models import loading from django.forms.models import modelform_factory from django.http import Http404 from django.shortcuts import render_to_response from django.utils.encoding import force_unicode from django.utils.functional import curry from django.utils.translation import ugettext as _ from django.contrib.admin.options import InlineModelAdmin from feincms import settings, ensure_completely_loaded from feincms.extensions import ExtensionModelAdmin from feincms.signals import itemeditor_post_save_related # ------------------------------------------------------------------------ FRONTEND_EDITING_MATCHER = re.compile(r'(\d+)\|(\w+)\|(\d+)') FEINCMS_CONTENT_FIELDSET_NAME = 'FEINCMS_CONTENT' FEINCMS_CONTENT_FIELDSET = (FEINCMS_CONTENT_FIELDSET_NAME, {'fields': ()}) # ------------------------------------------------------------------------ class ItemEditorForm(forms.ModelForm): """ The item editor form contains hidden region and ordering fields and should be used for all content type inlines. """ region = forms.CharField(widget=forms.HiddenInput()) ordering = forms.IntegerField(widget=forms.HiddenInput()) # ------------------------------------------------------------------------ class FeinCMSInline(InlineModelAdmin): """ Custom ``InlineModelAdmin`` subclass used for content types. """ form = ItemEditorForm extra = 0 fk_name = 'parent' template = 'admin/feincms/content_inline.html' # ------------------------------------------------------------------------ class ItemEditor(ExtensionModelAdmin): """ The ``ItemEditor`` is a drop-in replacement for ``ModelAdmin`` with the speciality of knowing how to work with :class:`feincms.models.Base` subclasses and associated content types. It does not have any public API except from everything inherited from' the standard ``ModelAdmin`` class. """ def __init__(self, model, admin_site): ensure_completely_loaded() super(ItemEditor, self).__init__(model, admin_site) def get_inline_instances(self, request, *args, **kwargs): inline_instances = super(ItemEditor, self).get_inline_instances(request, *args, **kwargs) self.append_feincms_inlines(inline_instances) return inline_instances def append_feincms_inlines(self, inline_instances): """ Append generated FeinCMS content inlines to native django inlines. """ for inline_class in self.get_feincms_inlines(self.model): inline_instance = inline_class(self.model, self.admin_site) inline_instances.append(inline_instance) def get_feincms_inlines(self, model): """ Generate genuine django inlines for registered content types. """ model._needs_content_types() inlines = [] for content_type in model._feincms_content_types: attrs = { '__module__': model.__module__, 'model': content_type, } if hasattr(content_type, 'feincms_item_editor_inline'): inline = content_type.feincms_item_editor_inline attrs['form'] = inline.form if hasattr(content_type, 'feincms_item_editor_form'): import warnings warnings.warn( 'feincms_item_editor_form on %s is ignored because feincms_item_editor_inline is set too' % content_type, RuntimeWarning) else: inline = FeinCMSInline attrs['form'] = getattr(content_type, 'feincms_item_editor_form', inline.form) name = '%sFeinCMSInline' % content_type.__name__ inlines.append(type(name, (inline,), attrs)) return inlines def _frontend_editing_view(self, request, cms_id, content_type, content_id): """ This view is used strictly for frontend editing -- it is not used inside the standard administration interface. The code in feincms/templates/admin/feincms/fe_tools.html knows how to call this view correctly. """ try: model_cls = loading.get_model(self.model._meta.app_label, content_type) obj = model_cls.objects.get(parent=cms_id, id=content_id) except: raise Http404() form_class_base = getattr(model_cls, 'feincms_item_editor_form', ItemEditorForm) ModelForm = modelform_factory(model_cls, exclude=('parent', 'region', 'ordering'), form=form_class_base, formfield_callback=curry(self.formfield_for_dbfield, request=request)) # we do not want to edit these two fields in the frontend editing mode; we are # strictly editing single content blocks there. # We have to remove them from the form because we explicitly redefined them in # the ItemEditorForm definition above. Just using exclude is not enough. del ModelForm.base_fields['region'] del ModelForm.base_fields['ordering'] if request.method == 'POST': # The prefix is used to replace the formset identifier from the ItemEditor # interface. Customization of the form is easily possible through either matching # the prefix (frontend editing) or the formset identifier (ItemEditor) as it is # done in the richtext and mediafile init.html item editor includes. form = ModelForm(request.POST, instance=obj, prefix=content_type) if form.is_valid(): obj = form.save() return render_to_response('admin/feincms/fe_editor_done.html', { 'content': obj.render(request=request), 'identifier': obj.fe_identifier(), 'FEINCMS_JQUERY_NO_CONFLICT': \ settings.FEINCMS_JQUERY_NO_CONFLICT, }, context_instance=template.RequestContext(request)) else: form = ModelForm(instance=obj, prefix=content_type) context = self.get_extra_context(request) context.update({ 'frontend_editing': True, 'title': _('Change %s') % force_unicode(model_cls._meta.verbose_name), 'object': obj, 'form': form, 'is_popup': True, 'media': self.media, }) return render_to_response('admin/feincms/fe_editor.html', context, context_instance=template.RequestContext(request)) def get_content_type_map(self): """ Prepare mapping of content types to their prettified names. """ content_types = [] for content_type in self.model._feincms_content_types: content_name = content_type._meta.verbose_name content_types.append((content_name, content_type.__name__.lower())) return content_types def get_extra_context(self, request): """ Return extra context parameters for add/change views. """ extra_context = { 'model': self.model, 'available_templates': getattr(self.model, '_feincms_templates', ()), 'has_parent_attribute': hasattr(self.model, 'parent'), 'content_types': self.get_content_type_map(), 'FEINCMS_JQUERY_NO_CONFLICT': settings.FEINCMS_JQUERY_NO_CONFLICT, 'FEINCMS_CONTENT_FIELDSET_NAME': FEINCMS_CONTENT_FIELDSET_NAME, 'FEINCMS_FRONTEND_EDITING': settings.FEINCMS_FRONTEND_EDITING, } for processor in self.model.feincms_item_editor_context_processors: extra_context.update(processor(request)) return extra_context def add_view(self, request, **kwargs): context = {} # insert dummy object as 'original' so template code can grab defaults # for template, etc. context['original'] = self.model() # If there are errors in the form, we need to preserve the object's # template as it was set when the user attempted to save it, so that # the same regions appear on screen. if request.method == 'POST' and \ hasattr(self.model, '_feincms_templates'): context['original'].template_key = request.POST['template_key'] context.update(self.get_extra_context(request)) context.update(kwargs.get('extra_context', {})) kwargs['extra_context'] = context return super(ItemEditor, self).add_view(request, **kwargs) def change_view(self, request, object_id, **kwargs): # Recognize frontend editing requests # This is done here so that the developer does not need to add # additional entries to # urls.py or something... res = FRONTEND_EDITING_MATCHER.search(object_id) if res: return self._frontend_editing_view( request, res.group(1), res.group(2), res.group(3)) context = {} context.update(self.get_extra_context(request)) context.update(kwargs.get('extra_context', {})) kwargs['extra_context'] = context return super(ItemEditor, self).change_view(request, object_id, **kwargs) # The next two add support for sending a "saving done" signal as soon # as all relevant data have been saved (especially all foreign key relations) # This can be used to keep functionality dependend on item content happy. # NOTE: These two can (and probably should) be replaced by overriding # `save_related` as soon as we don't depend on Django<1.4 any more. def response_add(self, request, obj, *args, **kwargs): r = super(ItemEditor, self).response_add(request, obj, *args, **kwargs) itemeditor_post_save_related.send(sender=obj.__class__, instance=obj, created=True) return r def response_change(self, request, obj, *args, **kwargs): r = super(ItemEditor, self).response_change(request, obj, *args, **kwargs) itemeditor_post_save_related.send(sender=obj.__class__, instance=obj, created=False) return r @property def change_form_template(self): return self.get_template_list() def get_template_list(self): # retained for backwards-compatibility, change_form_template wraps it opts = self.model._meta return [ 'admin/feincms/%s/%s/item_editor.html' % ( opts.app_label, opts.object_name.lower()), 'admin/feincms/%s/item_editor.html' % opts.app_label, 'admin/feincms/item_editor.html', ] def get_fieldsets(self, request, obj=None): """ Insert FEINCMS_CONTENT_FIELDSET it not present. Is it reasonable to assume this should always be included? """ fieldsets = copy.deepcopy( super(ItemEditor, self).get_fieldsets(request, obj)) if not FEINCMS_CONTENT_FIELDSET_NAME in dict(fieldsets).keys(): fieldsets.append(FEINCMS_CONTENT_FIELDSET) return fieldsets # These next are only used if later we use a subclass of this class # which also inherits from VersionAdmin. revision_form_template = "admin/feincms/revision_form.html" recover_form_template = "admin/feincms/recover_form.html" def render_revision_form(self, request, obj, version, context, revert=False, recover=False): context.update(self.get_extra_context(request)) return super(ItemEditor, self).render_revision_form(request, obj, version, context, revert, recover) feincms-1.7.4/feincms/admin/thumbnail.py000066400000000000000000000000001212255543400202110ustar00rootroot00000000000000feincms-1.7.4/feincms/admin/tree_editor.py000066400000000000000000000407741212255543400205610ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ import json import logging from django.conf import settings as django_settings from django.contrib import admin from django.contrib.admin.views import main from django.db.models import Q from django.http import (HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseNotFound, HttpResponseServerError) from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _, ugettext from mptt.exceptions import InvalidMove from mptt.forms import MPTTAdminForm from feincms import settings from feincms.extensions import ExtensionModelAdmin # ------------------------------------------------------------------------ def django_boolean_icon(field_val, alt_text=None, title=None): """ Return HTML code for a nice representation of true/false. """ # Origin: contrib/admin/templatetags/admin_list.py BOOLEAN_MAPPING = { True: 'yes', False: 'no', None: 'unknown' } alt_text = alt_text or BOOLEAN_MAPPING[field_val] if title is not None: title = 'title="%s" ' % title else: title = '' return mark_safe(u'%s' % (django_settings.STATIC_URL, BOOLEAN_MAPPING[field_val], alt_text, title)) def _build_tree_structure(cls): """ Build an in-memory representation of the item tree, trying to keep database accesses down to a minimum. The returned dictionary looks like this (as json dump): {"6": [7, 8, 10] "7": [12], "8": [], ... } """ all_nodes = { } mptt_opts = cls._mptt_meta for p_id, parent_id in cls.objects.order_by(mptt_opts.tree_id_attr, mptt_opts.left_attr).values_list("pk", "%s_id" % mptt_opts.parent_attr): all_nodes[p_id] = [] if parent_id: if not all_nodes.has_key(parent_id): # This happens very rarely, but protect against parents that # we have yet to iteratove over. all_nodes[parent_id] = [] all_nodes[parent_id].append(p_id) return all_nodes # ------------------------------------------------------------------------ def ajax_editable_boolean_cell(item, attr, text='', override=None): """ Generate a html snippet for showing a boolean value on the admin page. Item is an object, attr is the attribute name we should display. Text is an optional explanatory text to be included in the output. This function will emit code to produce a checkbox input with its state corresponding to the item.attr attribute if no override value is passed. This input is wired to run a JS ajax updater to toggle the value. If override is passed in, ignores the attr attribute and returns a static image for the override boolean with no user interaction possible (useful for "disabled and you can't change it" situations). """ if text: text = ' (%s)' % unicode(text) if override is not None: a = [ django_boolean_icon(override, text), text ] else: value = getattr(item, attr) a = [ '', text, ] a.insert(0, '
' % ( attr, item.pk )) a.append('
') return unicode(''.join(a)) # ------------------------------------------------------------------------ def ajax_editable_boolean(attr, short_description): """ Convenience function: Assign the return value of this method to a variable of your ModelAdmin class and put the variable name into list_display. Example:: class MyTreeEditor(TreeEditor): list_display = ('__unicode__', 'active_toggle') active_toggle = ajax_editable_boolean('active', _('is active')) """ def _fn(self, item): return ajax_editable_boolean_cell(item, attr) _fn.allow_tags = True _fn.short_description = short_description _fn.editable_boolean_field = attr return _fn # ------------------------------------------------------------------------ class ChangeList(main.ChangeList): """ Custom ``ChangeList`` class which ensures that the tree entries are always ordered in depth-first order (order by ``tree_id``, ``lft``). """ def __init__(self, request, *args, **kwargs): self.user = request.user super(ChangeList, self).__init__(request, *args, **kwargs) def get_query_set(self, *args, **kwargs): mptt_opts = self.model._mptt_meta return super(ChangeList, self).get_query_set(*args, **kwargs).order_by(mptt_opts.tree_id_attr, mptt_opts.left_attr) def get_results(self, request): mptt_opts = self.model._mptt_meta if settings.FEINCMS_TREE_EDITOR_INCLUDE_ANCESTORS: clauses = [Q(**{ mptt_opts.tree_id_attr: tree_id, mptt_opts.left_attr + '__lte': lft, mptt_opts.right_attr + '__gte': rght, } ) for lft, rght, tree_id in \ self.query_set.values_list(mptt_opts.left_attr, mptt_opts.right_attr, mptt_opts.tree_id_attr)] if clauses: self.query_set = self.model._default_manager.filter(reduce(lambda p, q: p|q, clauses)) super(ChangeList, self).get_results(request) for item in self.result_list: if settings.FEINCMS_TREE_EDITOR_OBJECT_PERMISSIONS: item.feincms_editable = self.model_admin.has_change_permission(request, item) else: item.feincms_editable = True # ------------------------------------------------------------------------ # MARK: - # ------------------------------------------------------------------------ class TreeEditor(ExtensionModelAdmin): """ The ``TreeEditor`` modifies the standard Django administration change list to a drag-drop enabled interface for django-mptt_-managed Django models. .. _django-mptt: https://github.com/django-mptt/django-mptt/ """ form = MPTTAdminForm if settings.FEINCMS_TREE_EDITOR_INCLUDE_ANCESTORS: # Make sure that no pagination is displayed. Slicing is disabled anyway, # therefore this value does not have an influence on the queryset list_per_page = 999999999 def __init__(self, *args, **kwargs): super(TreeEditor, self).__init__(*args, **kwargs) self.list_display = list(self.list_display) if 'indented_short_title' not in self.list_display: if self.list_display[0] == 'action_checkbox': self.list_display[1] = 'indented_short_title' else: self.list_display[0] = 'indented_short_title' self.list_display_links = ('indented_short_title',) opts = self.model._meta self.change_list_template = [ 'admin/feincms/%s/%s/tree_editor.html' % (opts.app_label, opts.object_name.lower()), 'admin/feincms/%s/tree_editor.html' % opts.app_label, 'admin/feincms/tree_editor.html', ] def editable(self, item): return getattr(item, 'feincms_editable', True) def indented_short_title(self, item): """ Generate a short title for an object, indent it depending on the object's depth in the hierarchy. """ mptt_opts = item._mptt_meta r = '' try: url = item.get_absolute_url() except (AttributeError,): url = None if url: r = '' % ( url, item.pk ) editable_class = '' if not getattr(item, 'feincms_editable', True): editable_class = ' tree-item-not-editable' r += '  ' % ( item.pk, editable_class, 14+getattr(item, mptt_opts.level_attr)*18) # r += '' if hasattr(item, 'short_title'): r += escape(item.short_title()) else: r += escape(unicode(item)) # r += '' return mark_safe(r) indented_short_title.short_description = _('title') indented_short_title.allow_tags = True def _collect_editable_booleans(self): """ Collect all fields marked as editable booleans. We do not want the user to be able to edit arbitrary fields by crafting an AJAX request by hand. """ if hasattr(self, '_ajax_editable_booleans'): return self._ajax_editable_booleans = {} for field in self.list_display: # The ajax_editable_boolean return value has to be assigned # to the ModelAdmin class try: item = getattr(self.__class__, field) except (AttributeError, TypeError): continue attr = getattr(item, 'editable_boolean_field', None) if attr: if hasattr(item, 'editable_boolean_result'): result_func = item.editable_boolean_result else: def _fn(attr): return lambda self, instance: [ajax_editable_boolean_cell(instance, attr)] result_func = _fn(attr) self._ajax_editable_booleans[attr] = result_func def _refresh_changelist_caches(self): """ Refresh information used to show the changelist tree structure such as inherited active/inactive states etc. XXX: This is somewhat hacky, but since it's an internal method, so be it. """ pass def _toggle_boolean(self, request): """ Handle an AJAX toggle_boolean request """ try: item_id = int(request.POST.get('item_id', None)) attr = str(request.POST.get('attr', None)) except: return HttpResponseBadRequest("Malformed request") if not request.user.is_staff: logging.warning("Denied AJAX request by non-staff %s to toggle boolean %s for object #%s", request.user, attr, item_id) return HttpResponseForbidden("You do not have permission to access this object") self._collect_editable_booleans() if not attr in self._ajax_editable_booleans: return HttpResponseBadRequest("not a valid attribute %s" % attr) try: obj = self.model._default_manager.get(pk=item_id) except self.model.DoesNotExist: return HttpResponseNotFound("Object does not exist") if not self.has_change_permission(request, obj=obj): logging.warning("Denied AJAX request by %s to toggle boolean %s for object %s", request.user, attr, item_id) return HttpResponseForbidden("You do not have permission to access this object") new_state = not getattr(obj, attr) logging.info("Processing request by %s to toggle %s on #%d %s to %s", request.user, attr, obj.pk, obj, "on" if new_state else "off") try: before_data = self._ajax_editable_booleans[attr](self, obj) setattr(obj, attr, new_state) obj.save() self._refresh_changelist_caches() # ???: Perhaps better a post_save signal? # Construct html snippets to send back to client for status update data = self._ajax_editable_booleans[attr](self, obj) except Exception: logging.exception("Unhandled exception while toggling %s on %s", attr, obj) return HttpResponseServerError("Unable to toggle %s on %s" % (attr, obj)) # Weed out unchanged cells to keep the updates small. This assumes # that the order a possible get_descendents() returns does not change # before and after toggling this attribute. Unlikely, but still... return HttpResponse(json.dumps( [b for a, b in zip(before_data, data) if a != b] ), content_type="application/json") def get_changelist(self, request, **kwargs): return ChangeList def changelist_view(self, request, extra_context=None, *args, **kwargs): """ Handle the changelist view, the django view for the model instances change list/actions page. """ if 'actions_column' not in self.list_display: self.list_display.append('actions_column') # handle common AJAX requests if request.is_ajax(): cmd = request.POST.get('__cmd') if cmd == 'toggle_boolean': return self._toggle_boolean(request) elif cmd == 'move_node': return self._move_node(request) else: return HttpResponseBadRequest('Oops. AJAX request not understood.') self._refresh_changelist_caches() extra_context = extra_context or {} extra_context['tree_structure'] = mark_safe(json.dumps( _build_tree_structure(self.model))) return super(TreeEditor, self).changelist_view(request, extra_context, *args, **kwargs) def has_change_permission(self, request, obj=None): """ Implement a lookup for object level permissions. Basically the same as ModelAdmin.has_change_permission, but also passes the obj parameter in. """ if settings.FEINCMS_TREE_EDITOR_OBJECT_PERMISSIONS: opts = self.opts r = request.user.has_perm(opts.app_label + '.' + opts.get_change_permission(), obj) else: r = True return r and super(TreeEditor, self).has_change_permission(request, obj) def has_delete_permission(self, request, obj=None): """ Implement a lookup for object level permissions. Basically the same as ModelAdmin.has_delete_permission, but also passes the obj parameter in. """ if settings.FEINCMS_TREE_EDITOR_OBJECT_PERMISSIONS: opts = self.opts r = request.user.has_perm(opts.app_label + '.' + opts.get_delete_permission(), obj) else: r = True return r and super(TreeEditor, self).has_delete_permission(request, obj) def _move_node(self, request): if hasattr(self.model.objects, 'move_node'): tree_manager = self.model.objects else: tree_manager = self.model._tree_manager cut_item = tree_manager.get(pk=request.POST.get('cut_item')) pasted_on = tree_manager.get(pk=request.POST.get('pasted_on')) position = request.POST.get('position') if position in ('last-child', 'left', 'right'): try: tree_manager.move_node(cut_item, pasted_on, position) except InvalidMove, e: self.message_user(request, unicode(e)) return HttpResponse('FAIL') # Ensure that model save has been run cut_item = self.model.objects.get(pk=cut_item.pk) cut_item.save() self.message_user(request, ugettext('%s has been moved to a new position.') % cut_item) return HttpResponse('OK') self.message_user(request, ugettext('Did not understand moving instruction.')) return HttpResponse('FAIL') def _actions_column(self, instance): return ['
',] def actions_column(self, instance): return u' '.join(self._actions_column(instance)) actions_column.allow_tags = True actions_column.short_description = _('actions') def delete_selected_tree(self, modeladmin, request, queryset): """ Deletes multiple instances and makes sure the MPTT fields get recalculated properly. (Because merely doing a bulk delete doesn't trigger the post_delete hooks.) """ n = 0 for obj in queryset: obj.delete() n += 1 self.message_user(request, _("Successfully deleted %s items.") % n) def get_actions(self, request): actions = super(TreeEditor, self).get_actions(request) if 'delete_selected' in actions: actions['delete_selected'] = ( self.delete_selected_tree, 'delete_selected', _("Delete selected %(verbose_name_plural)s")) return actions feincms-1.7.4/feincms/content/000077500000000000000000000000001212255543400162505ustar00rootroot00000000000000feincms-1.7.4/feincms/content/__init__.py000066400000000000000000000000001212255543400203470ustar00rootroot00000000000000feincms-1.7.4/feincms/content/application/000077500000000000000000000000001212255543400205535ustar00rootroot00000000000000feincms-1.7.4/feincms/content/application/__init__.py000066400000000000000000000000001212255543400226520ustar00rootroot00000000000000feincms-1.7.4/feincms/content/application/models.py000066400000000000000000000403331212255543400224130ustar00rootroot00000000000000""" Third-party application inclusion support. """ from email.utils import parsedate from time import mktime import re from django.core import urlresolvers from django.core.urlresolvers import Resolver404, resolve, reverse, NoReverseMatch from django.db import models from django.db.models import signals from django.http import HttpResponse from django.utils.functional import curry as partial, lazy, wraps from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from feincms import settings from feincms.admin.item_editor import ItemEditorForm from feincms.contrib.fields import JSONField from feincms.utils import get_object try: from threading import local except ImportError: from django.utils._threading_local import local # Used to store MPTT informations about the currently requested # page. The information will be used to find the best application # content instance if a particular application has been added # more than once to the current website. # Additionally, we store the page class too, because when we have # more than one page class, reverse() will want to prefer the page # class used to render the current page. (See issue #240) _local = local() def retrieve_page_information(page, request=None): """This is the request processor responsible for retrieving information about the currently processed page so that we can make an optimal match when reversing app URLs when the same ApplicationContent has been added several times to the website.""" _local.proximity_info = (page.tree_id, page.lft, page.rght, page.level) _local.page_class = page.__class__ _local.page_cache_key_fn = page.cache_key def _empty_reverse_cache(*args, **kwargs): _local.reverse_cache = {} def app_reverse(viewname, urlconf, args=None, kwargs=None, prefix=None, *vargs, **vkwargs): """ Reverse URLs from application contents Works almost like Django's own reverse() method except that it resolves URLs from application contents. The second argument, ``urlconf``, has to correspond to the URLconf parameter passed in the ``APPLICATIONS`` list to ``Page.create_content_type``:: app_reverse('mymodel-detail', 'myapp.urls', args=...) or app_reverse('mymodel-detail', 'myapp.urls', kwargs=...) The second argument may also be a request object if you want to reverse an URL belonging to the current application content. """ # First parameter might be a request instead of an urlconf path, so # we'll try to be helpful and extract the current urlconf from it extra_context = getattr(urlconf, '_feincms_extra_context', {}) appconfig = extra_context.get('app_config', {}) urlconf = appconfig.get('urlconf_path', urlconf) # vargs and vkwargs are used to send through additional parameters which # are uninteresting to us (such as current_app) # get additional cache keys from the page if available # refs https://github.com/feincms/feincms/pull/277/ fn = getattr(_local, 'page_cache_key_fn', lambda: '') cache_key_prefix = fn() app_cache_keys = { 'none': '%s:app_%s_none' % (cache_key_prefix, urlconf), } proximity_info = getattr(_local, 'proximity_info', None) url_prefix = None if proximity_info: app_cache_keys.update({ 'all': '%s:app_%s_%s_%s_%s_%s' % ( (cache_key_prefix, urlconf,) + proximity_info), 'tree': '%s:app_%s_%s' % ( cache_key_prefix, urlconf, proximity_info[0]), }) for key in ('all', 'tree', 'none'): try: url_prefix = _local.reverse_cache[app_cache_keys[key]] break except (AttributeError, KeyError): pass else: try: # Take the ApplicationContent class used by the current request model_class = _local.page_class.content_type_for(ApplicationContent) except AttributeError: model_class = None if not model_class: # Take any model_class = ApplicationContent._feincms_content_models[0] # TODO: Only active pages? What about multisite support? contents = model_class.objects.filter( urlconf_path=urlconf).select_related('parent') if proximity_info: # find the closest match within the same subtree tree_contents = contents.filter(parent__tree_id=proximity_info[0]) if not len(tree_contents): # no application contents within the same tree cache_key = 'tree' try: content = contents[0] except IndexError: content = None elif len(tree_contents) == 1: cache_key = 'tree' # just one match within the tree, use it content = tree_contents[0] else: # len(tree_contents) > 1 cache_key = 'all' try: # select all ancestors and descendants and get the one with # the smallest difference in levels content = (tree_contents.filter( parent__rght__gt=proximity_info[2], parent__lft__lt=proximity_info[1] ) | tree_contents.filter( parent__lft__lte=proximity_info[2], parent__lft__gte=proximity_info[1], )).extra({'level_diff':"abs(level-%d)" % proximity_info[3]} ).order_by('level_diff')[0] except IndexError: content = tree_contents[0] else: cache_key = 'none' try: content = contents[0] except IndexError: content = None if content: if urlconf in model_class.ALL_APPS_CONFIG: # We have an overridden URLconf urlconf = model_class.ALL_APPS_CONFIG[urlconf]['config'].get( 'urls', urlconf) if not hasattr(_local, 'reverse_cache'): _local.reverse_cache = {} prefix = content.parent.get_absolute_url() prefix += '/' if prefix[-1] != '/' else '' _local.reverse_cache[app_cache_keys[cache_key]] = url_prefix = ( urlconf, prefix) if url_prefix: return reverse(viewname, url_prefix[0], args=args, kwargs=kwargs, prefix=url_prefix[1], *vargs, **vkwargs) raise NoReverseMatch("Unable to find ApplicationContent for %r" % urlconf) #: Lazy version of ``app_reverse`` app_reverse_lazy = lazy(app_reverse, str) def permalink(func): """ Decorator that calls app_reverse() Use this instead of standard django.db.models.permalink if you want to integrate the model through ApplicationContent. The wrapped function must return 4 instead of 3 arguments:: class MyModel(models.Model): @appmodels.permalink def get_absolute_url(self): return ('myapp.urls', 'model_detail', (), {'slug': self.slug}) """ def inner(*args, **kwargs): return app_reverse(*func(*args, **kwargs)) return wraps(func)(inner) APPLICATIONCONTENT_RE = re.compile(r'^([^/]+)/([^/]+)$') class ApplicationContent(models.Model): #: parameters is used to serialize instance-specific data which will be # provided to the view code. This allows customization (e.g. "Embed # MyBlogApp for blog ") parameters = JSONField(null=True, editable=False) ALL_APPS_CONFIG = {} class Meta: abstract = True verbose_name = _('application content') verbose_name_plural = _('application contents') @classmethod def initialize_type(cls, APPLICATIONS): for i in APPLICATIONS: if not 2 <= len(i) <= 3: raise ValueError( "APPLICATIONS must be provided with tuples containing at" " least two parameters (urls, name) and an optional extra" " config dict") urls, name = i[0:2] if len(i) == 3: app_conf = i[2] if not isinstance(app_conf, dict): raise ValueError( "The third parameter of an APPLICATIONS entry must be" " a dict or the name of one!") else: app_conf = {} cls.ALL_APPS_CONFIG[urls] = { "urls": urls, "name": name, "config": app_conf } cls.add_to_class('urlconf_path', models.CharField(_('application'), max_length=100, choices=[ (c['urls'], c['name']) for c in cls.ALL_APPS_CONFIG.values()]) ) class ApplicationContentItemEditorForm(ItemEditorForm): app_config = {} custom_fields = {} def __init__(self, *args, **kwargs): super(ApplicationContentItemEditorForm, self).__init__(*args, **kwargs) instance = kwargs.get("instance", None) if instance: try: # TODO use urlconf_path from POST if set # urlconf_path = request.POST.get('...urlconf_path', # instance.urlconf_path) self.app_config = cls.ALL_APPS_CONFIG[ instance.urlconf_path]['config'] except KeyError: self.app_config = {} self.custom_fields = {} admin_fields = self.app_config.get('admin_fields', {}) if isinstance(admin_fields, dict): self.custom_fields.update(admin_fields) else: get_fields = get_object(admin_fields) self.custom_fields.update( get_fields(self, *args, **kwargs)) for k, v in self.custom_fields.items(): self.fields[k] = v def save(self, commit=True, *args, **kwargs): # Django ModelForms return the model instance from save. We'll # call save with commit=False first to do any necessary work & # get the model so we can set .parameters to the values of our # custom fields before calling save(commit=True) m = super(ApplicationContentItemEditorForm, self).save( commit=False, *args, **kwargs) m.parameters = dict((k, self.cleaned_data[k]) for k in self.custom_fields if k in self.cleaned_data) if commit: m.save(**kwargs) return m # This provides hooks for us to customize the admin interface for # embedded instances: cls.feincms_item_editor_form = ApplicationContentItemEditorForm # Make sure the patched reverse() method has all information it needs cls.parent.field.rel.to.register_request_processor( retrieve_page_information) signals.post_save.connect(_empty_reverse_cache, sender=cls) signals.post_delete.connect(_empty_reverse_cache, sender=cls) def __init__(self, *args, **kwargs): super(ApplicationContent, self).__init__(*args, **kwargs) self.app_config = self.ALL_APPS_CONFIG.get( self.urlconf_path, {}).get('config', {}) def process(self, request, **kw): page_url = self.parent.get_absolute_url() # Provide a way for appcontent items to customize URL processing by # altering the perceived path of the page: if "path_mapper" in self.app_config: path_mapper = get_object(self.app_config["path_mapper"]) path, page_url = path_mapper( request.path, page_url, appcontent_parameters=self.parameters ) else: path = request._feincms_extra_context['extra_path'] # Resolve the module holding the application urls. urlconf_path = self.app_config.get('urls', self.urlconf_path) try: fn, args, kwargs = resolve(path, urlconf_path) except (ValueError, Resolver404): raise Resolver404('Not found (resolving %r in %r failed)' % ( path, urlconf_path)) # Variables from the ApplicationContent parameters are added to request # so we can expose them to our templates via the appcontent_parameters # context_processor request._feincms_extra_context.update(self.parameters) # Save the application configuration for reuse elsewhere request._feincms_extra_context.update({ 'app_config': dict(self.app_config, urlconf_path=self.urlconf_path)}) view_wrapper = self.app_config.get("view_wrapper", None) if view_wrapper: fn = partial( get_object(view_wrapper), view=fn, appcontent_parameters=self.parameters ) output = fn(request, *args, **kwargs) if isinstance(output, HttpResponse): if self.send_directly(request, output): return output elif output.status_code == 200: # If the response supports deferred rendering, render the # response right now. We do not handle template response # middleware. if hasattr(output, 'render') and callable(output.render): output.render() self.rendered_result = mark_safe( output.content.decode('utf-8')) self.rendered_headers = {} # Copy relevant headers for later perusal for h in ('Cache-Control', 'Last-Modified', 'Expires'): if h in output: self.rendered_headers.setdefault( h, []).append(output[h]) elif isinstance(output, tuple) and 'view' in kw: kw['view'].template_name = output[0] kw['view'].request._feincms_extra_context.update(output[1]) else: self.rendered_result = mark_safe(output) return True # successful def send_directly(self, request, response): mimetype = response.get('Content-Type', 'text/plain') if ';' in mimetype: mimetype = mimetype.split(';')[0] mimetype = mimetype.strip() return (response.status_code != 200 or request.is_ajax() or getattr(response, 'standalone', False) or mimetype not in ('text/html', 'text/plain')) def render(self, **kwargs): return getattr(self, 'rendered_result', u'') def finalize(self, request, response): headers = getattr(self, 'rendered_headers', None) if headers: self._update_response_headers(request, response, headers) def _update_response_headers(self, request, response, headers): """ Combine all headers that were set by the different content types We are interested in Cache-Control, Last-Modified, Expires """ from django.utils.http import http_date # Ideally, for the Cache-Control header, we'd want to do some # intelligent combining, but that's hard. Let's just collect and unique # them and let the client worry about that. cc_headers = set(('must-revalidate',)) for x in (cc.split(",") for cc in headers.get('Cache-Control', ())): cc_headers |= set((s.strip() for s in x)) if len(cc_headers): response['Cache-Control'] = ", ".join(cc_headers) else: # Default value response['Cache-Control'] = 'no-cache, must-revalidate' # Check all Last-Modified headers, choose the latest one lm_list = [parsedate(x) for x in headers.get('Last-Modified', ())] if len(lm_list) > 0: response['Last-Modified'] = http_date(mktime(max(lm_list))) # Check all Expires headers, choose the earliest one lm_list = [parsedate(x) for x in headers.get('Expires', ())] if len(lm_list) > 0: response['Expires'] = http_date(mktime(min(lm_list))) feincms-1.7.4/feincms/content/comments/000077500000000000000000000000001212255543400200755ustar00rootroot00000000000000feincms-1.7.4/feincms/content/comments/__init__.py000066400000000000000000000000001212255543400221740ustar00rootroot00000000000000feincms-1.7.4/feincms/content/comments/models.py000066400000000000000000000076551212255543400217470ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ # # Created by Martin J. Laubach on 08.01.10. # skyl wuz here (11.05.10) # # ------------------------------------------------------------------------ """ Embed a comment list and comment form anywhere. Uses the standard ``django.contrib.comments`` application. """ from django.contrib import comments from django.db import models from django.http import HttpResponseRedirect from django.template import RequestContext from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ # ------------------------------------------------------------------------ class CommentsContent(models.Model): comments_enabled = models.BooleanField(_('enabled'), default=True, help_text=_('New comments may be added')) class Meta: abstract = True verbose_name = _('comments') verbose_name_plural = _('comments') @classmethod def initialize_type(cls): from feincms.admin.item_editor import ItemEditorForm class CommentContentAdminForm(ItemEditorForm): def __init__(self, *args, **kwargs): super(CommentContentAdminForm, self).__init__(*args, **kwargs) parent = kwargs.get('instance', None) if parent is not None: f = self.fields['comments_enabled'] r = f.help_text r += u'
' comments_model = comments.get_model() for c in comments_model.objects.for_model(parent.parent).order_by('-submit_date'): r += '
# %(pk)d %(comment)s - %(is_public)s
' % \ { 'pk': c.id, 'comment': c.comment[:80], 'is_public': c.is_public and _('public') or _('not public'), 'app': comments_model._meta.app_label, 'model': comments_model._meta.module_name } f.help_text = r cls.feincms_item_editor_form = CommentContentAdminForm def process(self, request, **kwargs): parent_type = self.parent.__class__.__name__.lower() comment_page = self.parent if hasattr(comment_page, 'original_translation') and comment_page.original_translation: comment_page = comment_page.original_translation f = None if self.comments_enabled and request.POST: # I guess the drawback is that this page can't handle any other types of posts # just the comments for right now, but if we just post to the current path # and handle it this way .. at least it works for now. #extra = request._feincms_extra_context.get('page_extra_path', ()) #if len(extra) > 0 and extra[0] == u"post-comment": from django.contrib.comments.views.comments import post_comment r = post_comment(request, next=comment_page.get_absolute_url()) if isinstance(r, HttpResponseRedirect): return r f = comments.get_form()(comment_page, data=request.POST) if f is None: f = comments.get_form()(comment_page) self.rendered_output = render_to_string([ 'content/comments/%s.html' % parent_type, 'content/comments/default-site.html', 'content/comments/default.html', ], RequestContext(request, { 'content': self, 'feincms_page': self.parent, 'parent': comment_page, 'form': f, })) def render(self, **kwargs): return getattr(self, 'rendered_output', u'') feincms-1.7.4/feincms/content/contactform/000077500000000000000000000000001212255543400205675ustar00rootroot00000000000000feincms-1.7.4/feincms/content/contactform/__init__.py000066400000000000000000000000001212255543400226660ustar00rootroot00000000000000feincms-1.7.4/feincms/content/contactform/models.py000066400000000000000000000050001212255543400224170ustar00rootroot00000000000000""" Simple contact form for FeinCMS. The default form class has name, email, subject and content fields, content being the only one which is not required. You can provide your own comment form by passing an additional ``form=YourClass`` argument to the ``create_content_type`` call. """ from django import forms from django.core.mail import send_mail from django.db import models from django.http import HttpResponseRedirect from django.template import RequestContext from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ class ContactForm(forms.Form): name = forms.CharField(label=_('name')) email = forms.EmailField(label=_('email')) subject = forms.CharField(label=_('subject')) content = forms.CharField(widget=forms.Textarea, required=False, label=_('content')) class ContactFormContent(models.Model): form = ContactForm email = models.EmailField() subject = models.CharField(max_length=200) class Meta: abstract = True verbose_name = _('contact form') verbose_name_plural = _('contact forms') @classmethod def initialize_type(cls, form=None): if form: cls.form = form def process(self, request, **kwargs): if request.GET.get('_cf_thanks'): self.rendered_output = render_to_string('content/contactform/thanks.html', context_instance=RequestContext(request)) return if request.method == 'POST': form = self.form(request.POST) if form.is_valid(): send_mail( form.cleaned_data['subject'], render_to_string('content/contactform/email.txt', { 'data': form.cleaned_data, }), form.cleaned_data['email'], [self.email], fail_silently=True) return HttpResponseRedirect('?_cf_thanks=1') else: initial = {'subject': self.subject} if request.user.is_authenticated(): initial['email'] = request.user.email initial['name'] = request.user.get_full_name() form = self.form(initial=initial) self.rendered_output = render_to_string('content/contactform/form.html', { 'content': self, 'form': form, }, context_instance=RequestContext(request)) def render(self, **kwargs): return getattr(self, 'rendered_output', u'') feincms-1.7.4/feincms/content/file/000077500000000000000000000000001212255543400171675ustar00rootroot00000000000000feincms-1.7.4/feincms/content/file/__init__.py000066400000000000000000000000001212255543400212660ustar00rootroot00000000000000feincms-1.7.4/feincms/content/file/models.py000066400000000000000000000016541212255543400210320ustar00rootroot00000000000000""" Simple file inclusion content: You should probably use the media library instead. """ import os from django.db import models from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ from feincms import settings class FileContent(models.Model): # You should probably use # `feincms.content.medialibrary.models.MediaFileContent` instead. title = models.CharField(max_length=200) file = models.FileField( _('file'), max_length=255, upload_to=os.path.join(settings.FEINCMS_UPLOAD_PREFIX, 'filecontent')) class Meta: abstract = True verbose_name = _('file') verbose_name_plural = _('files') def render(self, **kwargs): return render_to_string([ 'content/file/%s.html' % self.region, 'content/file/default.html', ], {'content': self}, context_instance=kwargs.get('context')) feincms-1.7.4/feincms/content/image/000077500000000000000000000000001212255543400173325ustar00rootroot00000000000000feincms-1.7.4/feincms/content/image/__init__.py000066400000000000000000000000001212255543400214310ustar00rootroot00000000000000feincms-1.7.4/feincms/content/image/models.py000066400000000000000000000060321212255543400211700ustar00rootroot00000000000000""" Simple image inclusion content: You should probably use the media library instead. """ import os from django.core.exceptions import ImproperlyConfigured from django.db import models from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ from feincms import settings from feincms.templatetags import feincms_thumbnail class ImageContent(models.Model): # You should probably use # `feincms.content.medialibrary.models.MediaFileContent` instead. """ Create an ImageContent like this:: Cls.create_content_type( ImageContent, POSITION_CHOICES=( ('left', 'Float to left'), ('right', 'Float to right'), ('block', 'Block'), ), FORMAT_CHOICES=( ('noop', 'Do not resize'), ('cropscale:100x100', 'Square Thumbnail'), ('cropscale:200x450', 'Medium Portait'), ('thumbnail:1000x1000', 'Large'), )) Note that FORMAT_CHOICES is optional. The part before the colon corresponds to the template filters in the ``feincms_thumbnail`` template filter library. Known values are ``cropscale`` and ``thumbnail``. Everything else (such as ``noop``) is ignored. """ image = models.ImageField( _('image'), max_length=255, upload_to=os.path.join(settings.FEINCMS_UPLOAD_PREFIX, 'imagecontent')) alt_text = models.CharField( _('alternate text'), max_length=255, blank=True, help_text=_('Description of image')) caption = models.CharField(_('caption'), max_length=255, blank=True) class Meta: abstract = True verbose_name = _('image') verbose_name_plural = _('images') def render(self, **kwargs): templates = ['content/image/default.html'] if hasattr(self, 'position'): templates.insert(0, 'content/image/%s.html' % self.position) return render_to_string( templates, {'content': self}, context_instance=kwargs.get('context')) def get_image(self): type, separator, size = getattr(self, 'format', '').partition(':') if not size: return self.image thumbnailer = { 'cropscale': feincms_thumbnail.CropscaleThumbnailer, }.get(type, feincms_thumbnail.Thumbnailer) return thumbnailer(self.image, size) @classmethod def initialize_type(cls, POSITION_CHOICES=None, FORMAT_CHOICES=None): if POSITION_CHOICES: models.CharField( _('position'), max_length=10, choices=POSITION_CHOICES, default=POSITION_CHOICES[0][0] ).contribute_to_class(cls, 'position') if FORMAT_CHOICES: models.CharField( _('format'), max_length=64, choices=FORMAT_CHOICES, default=FORMAT_CHOICES[0][0] ).contribute_to_class(cls, 'format') feincms-1.7.4/feincms/content/medialibrary/000077500000000000000000000000001212255543400207145ustar00rootroot00000000000000feincms-1.7.4/feincms/content/medialibrary/__init__.py000066400000000000000000000000001212255543400230130ustar00rootroot00000000000000feincms-1.7.4/feincms/content/medialibrary/models.py000066400000000000000000000046111212255543400225530ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from django.contrib import admin from django.core.exceptions import ImproperlyConfigured from django.db import models from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ from feincms.admin.item_editor import FeinCMSInline from feincms.module.medialibrary.fields import ContentWithMediaFile class MediaFileContentInline(FeinCMSInline): raw_id_fields = ('mediafile',) radio_fields = {'type': admin.VERTICAL} class MediaFileContent(ContentWithMediaFile): """ Rehashed, backwards-incompatible media file content which does not contain the problems from v1 anymore. Create a media file content as follows:: from feincms.content.medialibrary.v2 import MediaFileContent Page.create_content_type(MediaFileContent, TYPE_CHOICES=( ('default', _('Default')), ('lightbox', _('Lightbox')), ('whatever', _('Whatever')), )) For a media file of type 'image' and type 'lightbox', the following templates are tried in order: * content/mediafile/image_lightbox.html * content/mediafile/image.html * content/mediafile/lightbox.html * content/mediafile/default.html The context contains ``content`` and ``request`` (if available). """ feincms_item_editor_inline = MediaFileContentInline class Meta: abstract = True verbose_name = _('media file') verbose_name_plural = _('media files') @classmethod def initialize_type(cls, TYPE_CHOICES=None): if TYPE_CHOICES is None: raise ImproperlyConfigured('You have to set TYPE_CHOICES when' ' creating a %s' % cls.__name__) cls.add_to_class('type', models.CharField(_('type'), max_length=20, choices=TYPE_CHOICES, default=TYPE_CHOICES[0][0])) def render(self, **kwargs): ctx = {'content': self} ctx.update(kwargs) return render_to_string([ 'content/mediafile/%s_%s.html' % (self.mediafile.type, self.type), 'content/mediafile/%s.html' % self.mediafile.type, 'content/mediafile/%s.html' % self.type, 'content/mediafile/default.html', ], ctx, context_instance=kwargs.get('context')) feincms-1.7.4/feincms/content/medialibrary/v2.py000066400000000000000000000005231212255543400216150ustar00rootroot00000000000000from __future__ import absolute_import import warnings warnings.warn( 'The contents of feincms.content.medialibrary.v2 have been moved to' ' feincms.content.medialibrary.models. Support for importing those' ' classes through v2 will be removed in FeinCMS v1.8.', DeprecationWarning, stacklevel=2) from .models import * feincms-1.7.4/feincms/content/raw/000077500000000000000000000000001212255543400170415ustar00rootroot00000000000000feincms-1.7.4/feincms/content/raw/__init__.py000066400000000000000000000000001212255543400211400ustar00rootroot00000000000000feincms-1.7.4/feincms/content/raw/models.py000066400000000000000000000011171212255543400206760ustar00rootroot00000000000000from django.db import models from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ class RawContent(models.Model): """ Content type which can be used to input raw HTML code into the CMS. The content isn't escaped and can be used to insert CSS or JS snippets too. """ text = models.TextField(_('content'), blank=True) class Meta: abstract = True verbose_name = _('raw content') verbose_name_plural = _('raw contents') def render(self, **kwargs): return mark_safe(self.text) feincms-1.7.4/feincms/content/richtext/000077500000000000000000000000001212255543400201025ustar00rootroot00000000000000feincms-1.7.4/feincms/content/richtext/__init__.py000066400000000000000000000000001212255543400222010ustar00rootroot00000000000000feincms-1.7.4/feincms/content/richtext/models.py000066400000000000000000000132611212255543400217420ustar00rootroot00000000000000from django import forms from django.core.exceptions import ImproperlyConfigured from django.db import models from django.forms.util import ErrorList from django.template.loader import render_to_string from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from feincms import settings from feincms.admin.item_editor import ItemEditorForm from feincms.contrib.richtext import RichTextField from feincms.utils import get_object class RichTextContentAdminForm(ItemEditorForm): #: If FEINCMS_TIDY_ALLOW_WARNINGS_OVERRIDE allows, we'll convert this into # a checkbox so the user can choose whether to ignore HTML validation # warnings instead of fixing them: seen_tidy_warnings = forms.BooleanField( required=False, label=_("HTML Tidy"), help_text=_("Ignore the HTML validation warnings"), widget=forms.HiddenInput ) def clean(self): cleaned_data = super(RichTextContentAdminForm, self).clean() if settings.FEINCMS_TIDY_HTML: text, errors, warnings = get_object(settings.FEINCMS_TIDY_FUNCTION)(cleaned_data['text']) # Ick, but we need to be able to update text and seen_tidy_warnings: self.data = self.data.copy() # We always replace the HTML with the tidied version: cleaned_data['text'] = text self.data['%s-text' % self.prefix] = text if settings.FEINCMS_TIDY_SHOW_WARNINGS and (errors or warnings): if settings.FEINCMS_TIDY_ALLOW_WARNINGS_OVERRIDE: # Convert the ignore input from hidden to Checkbox so the user can change it: self.fields['seen_tidy_warnings'].widget = forms.CheckboxInput() if errors or not (settings.FEINCMS_TIDY_ALLOW_WARNINGS_OVERRIDE and cleaned_data['seen_tidy_warnings']): self._errors["text"] = ErrorList([mark_safe( _("HTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)s") % { "count": len(warnings) + len(errors), "messages": '
  • %s
' % "
  • ".join(map(escape, errors + warnings)) } )]) # If we're allowed to ignore warnings and we don't have any # errors we'll set our hidden form field to allow the user to # ignore warnings on the next submit: if not errors and settings.FEINCMS_TIDY_ALLOW_WARNINGS_OVERRIDE: self.data["%s-seen_tidy_warnings" % self.prefix] = True return cleaned_data class RichTextContent(models.Model): """ Rich text content. Uses TinyMCE by default, but can be configured to do anything you want using ``FEINCMS_RICHTEXT_INIT_CONTEXT`` and ``FEINCMS_RICHTEXT_INIT_TEMPLATE``. Optionally runs the HTML code through HTML cleaners if you specify ``cleanse=True`` when calling ``create_content_type``. """ form = RichTextContentAdminForm feincms_item_editor_form = RichTextContentAdminForm feincms_item_editor_context_processors = ( lambda x: settings.FEINCMS_RICHTEXT_INIT_CONTEXT, ) feincms_item_editor_includes = { 'head': [ settings.FEINCMS_RICHTEXT_INIT_TEMPLATE ], } text = RichTextField(_('text'), blank=True) class Meta: abstract = True verbose_name = _('rich text') verbose_name_plural = _('rich texts') def render(self, **kwargs): return render_to_string('content/richtext/default.html', { 'content': self }, context_instance=kwargs.get('context')) def save(self, *args, **kwargs): # TODO: Move this to the form? if getattr(self, 'cleanse', False): # Passes the rich text content as first argument because # the passed callable has been converted into a bound method self.text = self.cleanse(self.text) super(RichTextContent, self).save(*args, **kwargs) save.alters_data = True @classmethod def initialize_type(cls, cleanse=False): def to_instance_method(func): def func_im(self, *args, **kwargs): return func(*args, **kwargs) return func_im if cleanse: # If cleanse is True use default cleanse method if cleanse == True: import warnings warnings.warn("Please pass a callable instead. cleanse=True is" " being deprecated in favor of explicitly specifying the" " cleansing function. To continue using the same" " functionality, pip install feincms-cleanse and pass" " cleanse=feincms_cleanse.cleanse_html to the" " create_content_type call." " Support for cleanse=True will be removed in FeinCMS v1.8.", DeprecationWarning, stacklevel=2) from feincms.utils.html.cleanse import cleanse_html cls.cleanse = to_instance_method(cleanse_html) # Otherwise use passed callable else: cls.cleanse = to_instance_method(cleanse) # TODO: Move this into somewhere more generic: if settings.FEINCMS_TIDY_HTML: # Make sure we can load the tidy function without dependency failures: try: get_object(settings.FEINCMS_TIDY_FUNCTION) except ImportError, e: raise ImproperlyConfigured("FEINCMS_TIDY_HTML is enabled but the HTML tidy function %s could not be imported: %s" % (settings.FEINCMS_TIDY_FUNCTION, e)) feincms-1.7.4/feincms/content/rss/000077500000000000000000000000001212255543400170575ustar00rootroot00000000000000feincms-1.7.4/feincms/content/rss/__init__.py000066400000000000000000000000001212255543400211560ustar00rootroot00000000000000feincms-1.7.4/feincms/content/rss/models.py000066400000000000000000000034131212255543400207150ustar00rootroot00000000000000import time from django.db import models from django.utils import timezone from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.template.loader import render_to_string import feedparser class RSSContent(models.Model): """ RSS feed inclusion content. This content requires a cronjob on the server, which runs ``./manage.py update_rsscontent`` every couple of hours. """ title = models.CharField(_('title'), max_length=50, help_text=_('The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.')) link = models.URLField(_('link')) rendered_content = models.TextField(_('pre-rendered content'), blank=True, editable=False) last_updated = models.DateTimeField(_('last updated'), blank=True, null=True) max_items = models.IntegerField(_('max. items'), default=5) class Meta: abstract = True verbose_name = _('RSS feed') verbose_name_plural = _('RSS feeds') def render(self, **kwargs): return mark_safe(self.rendered_content) def cache_content(self, date_format=None, save=True): feed = feedparser.parse(self.link) entries = feed['entries'][:self.max_items] if date_format: for entry in entries: entry.updated = time.strftime(date_format, entry.updated_parsed) self.rendered_content = render_to_string('content/rss/content.html', { 'feed_title': self.title, 'feed_link': feed['feed'].get('link'), 'entries': entries, }) self.last_updated = timezone.now() if save: self.save() cache_content.alters_data = True feincms-1.7.4/feincms/content/section/000077500000000000000000000000001212255543400177145ustar00rootroot00000000000000feincms-1.7.4/feincms/content/section/__init__.py000066400000000000000000000000001212255543400220130ustar00rootroot00000000000000feincms-1.7.4/feincms/content/section/models.py000066400000000000000000000102221212255543400215460ustar00rootroot00000000000000from django import forms from django.conf import settings as django_settings from django.contrib import admin from django.core.exceptions import ImproperlyConfigured from django.db import models from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ from feincms import settings from feincms.admin.item_editor import FeinCMSInline from feincms.contrib.richtext import RichTextField from feincms.module.medialibrary.fields import MediaFileForeignKey from feincms.module.medialibrary.models import MediaFile class SectionContentInline(FeinCMSInline): raw_id_fields = ('mediafile',) radio_fields = {'type': admin.VERTICAL} class SectionContent(models.Model): """ Title, media file and rich text fields in one content block. """ feincms_item_editor_inline = SectionContentInline feincms_item_editor_context_processors = ( lambda x: settings.FEINCMS_RICHTEXT_INIT_CONTEXT, ) feincms_item_editor_includes = { 'head': [settings.FEINCMS_RICHTEXT_INIT_TEMPLATE], } title = models.CharField(_('title'), max_length=200, blank=True) richtext = RichTextField(_('text'), blank=True) mediafile = MediaFileForeignKey(MediaFile, verbose_name=_('media file'), related_name='+', blank=True, null=True) class Meta: abstract = True verbose_name = _('section') verbose_name_plural = _('sections') @classmethod def initialize_type(cls, TYPE_CHOICES=None, cleanse=False): if 'feincms.module.medialibrary' not in django_settings.INSTALLED_APPS: raise ImproperlyConfigured, 'You have to add \'feincms.module.medialibrary\' to your INSTALLED_APPS before creating a %s' % cls.__name__ if TYPE_CHOICES is None: raise ImproperlyConfigured, 'You need to set TYPE_CHOICES when creating a %s' % cls.__name__ cls.add_to_class('type', models.CharField(_('type'), max_length=10, choices=TYPE_CHOICES, default=TYPE_CHOICES[0][0])) if cleanse: # If cleanse is True use default cleanse method if cleanse == True: import warnings warnings.warn("Please pass a callable instead. cleanse=True is" " being deprecated in favor of explicitly specifying the" " cleansing function. To continue using the same" " functionality, pip install feincms-cleanse and pass" " cleanse=feincms_cleanse.cleanse_html to the" " create_content_type call." " Support for cleanse=True will be removed in FeinCMS v1.8.", DeprecationWarning, stacklevel=2) from feincms.utils.html.cleanse import cleanse_html cls.cleanse = cleanse_html # Otherwise use passed callable else: cls.cleanse = cleanse @classmethod def get_queryset(cls, filter_args): # Explicitly add nullable FK mediafile to minimize the DB query count return cls.objects.select_related('parent', 'mediafile').filter(filter_args) def render(self, **kwargs): if self.mediafile: mediafile_type = self.mediafile.type else: mediafile_type = 'nomedia' return render_to_string([ 'content/section/%s_%s.html' % (self.type, mediafile_type), 'content/section/%s.html' % self.type, 'content/section/%s.html' % mediafile_type, 'content/section/default.html', ], {'content': self}) def save(self, *args, **kwargs): if getattr(self, 'cleanse', False): try: # Passes the rich text content as first argument because # the passed callable has been converted into a bound method self.richtext = self.cleanse(self.richtext) except TypeError: # Call the original callable, does not pass the rich richtext # content instance along self.richtext = self.cleanse.im_func(self.richtext) super(SectionContent, self).save(*args, **kwargs) save.alters_data = True feincms-1.7.4/feincms/content/table/000077500000000000000000000000001212255543400173375ustar00rootroot00000000000000feincms-1.7.4/feincms/content/table/__init__.py000066400000000000000000000000001212255543400214360ustar00rootroot00000000000000feincms-1.7.4/feincms/content/table/models.py000066400000000000000000000062711212255543400212020ustar00rootroot00000000000000import json from django.db import models from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ class TableFormatter(object): """ Table formatter which should convert a structure of nested lists into a suitable HTML table representation. """ def __init__(self, **kwargs): for k, v in kwargs.items(): setattr(self, k, v) def __call__(self, data): return self.format_table(data) def format_table(self, data): return u'%s
    ' % u''.join( self.format_row(index, row) for index, row in enumerate(data)) def format_row(self, index, row): self.row_index = index return u'%s' % u''.join( self.format_cell(index, cell) for index, cell in enumerate(row)) def format_cell(self, index, cell): return u'%s' % cell class TitleTableFormatter(TableFormatter): """ TitleTableFormatter(first_row_title=True, first_column_title=True) """ def format_cell(self, index, cell): if (not self.row_index and getattr(self, 'first_row_title', True)) or \ (not index and getattr(self, 'first_column_title', True)): return u'%s' % cell return u'%s' % cell class TableContent(models.Model): """ Content to edit and display HTML tables in the CMS. The standard rich text editor configuration in FeinCMS does not activate the table plugin. This content type can be used to edit and display nicely formatted HTML tables. It is easy to specify your own table renderers. """ feincms_item_editor_includes = { 'head': ['admin/content/table/init.html'], } html = models.TextField('HTML', blank=True, editable=False) DEFAULT_TYPES = [ ('plain', _('plain'), TableFormatter()), ('titlerow', _('title row'), TitleTableFormatter( first_row_title=True, first_column_title=False)), ('titlerowcol', _('title row and column'), TitleTableFormatter( first_row_title=True, first_column_title=True)), ] class Meta: abstract = True verbose_name = _('table') verbose_name_plural = _('tables') @classmethod def initialize_type(cls, TYPES=None): TYPES = TYPES or cls.DEFAULT_TYPES cls.FORMATTERS = dict((t[0], t[2]) for t in TYPES) cls.TYPE_CHOICES = [(t[0], t[1]) for t in TYPES] cls.add_to_class('type', models.CharField(_('type'), max_length=20, choices=cls.TYPE_CHOICES, default=cls.TYPE_CHOICES[0][0])) # Add after type, so that type comes before data in admin interface cls.add_to_class('data', models.TextField(_('data'), blank=True)) def render(self, **kwargs): return mark_safe(self.html) def save(self, *args, **kwargs): # XXX ugly, but otherwise the decoder raises exceptions self.data = self.data.replace('\r', '\\r').replace('\n', '\\n').replace('\t', '\\t') self.html = self.data and self.FORMATTERS[self.type](json.loads(self.data)) or u'' super(TableContent, self).save(*args, **kwargs) save.alters_data = True feincms-1.7.4/feincms/content/template/000077500000000000000000000000001212255543400200635ustar00rootroot00000000000000feincms-1.7.4/feincms/content/template/__init__.py000066400000000000000000000000001212255543400221620ustar00rootroot00000000000000feincms-1.7.4/feincms/content/template/models.py000066400000000000000000000051751212255543400217300ustar00rootroot00000000000000import os from django.db import models from django.template.loader import (Context, Template, TemplateDoesNotExist, find_template_loader) from django.utils.translation import ugettext_lazy as _ DEFAULT_TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ) class TemplateChoices(object): def __init__(self, template_loaders): self.template_loaders = template_loaders def __iter__(self): seen = set() for loader in self.template_loaders: for basepath in loader.get_template_sources('.'): path = os.path.join(basepath, 'content', 'template') try: templates = os.listdir(path) except (OSError, IOError): continue for template in templates: if template in seen: continue if template.endswith(('~', '.tmp')): continue seen.add(template) return ((t, t) for t in sorted(seen)) class TemplateContent(models.Model): """ This content type scans all template folders for files in the ``content/template/`` folder and lets the website administrator select any template from a set of provided choices. The templates aren't restricted in any way. """ class Meta: abstract = True verbose_name = _('template content') verbose_name_plural = _('template contents') @classmethod def initialize_type(cls, TEMPLATE_LOADERS=DEFAULT_TEMPLATE_LOADERS): cls.template_loaders = [find_template_loader(loader) for loader in TEMPLATE_LOADERS if loader] cls.add_to_class('filename', models.CharField(_('template'), max_length=100, choices=TemplateChoices(cls.template_loaders))) def render(self, **kwargs): context = kwargs.pop('context', None) name = 'content/template/%s' % self.filename for loader in self.template_loaders: try: template, display_name = loader.load_template(name) except TemplateDoesNotExist: continue if not hasattr(template, 'render'): template = Template(template, name=name) if context: ctx = context ctx.update(dict(content=self, **kwargs)) else: ctx = Context(dict(content=self, **kwargs)) result = template.render(ctx) if context: context.pop() return result return u'' # Fail? feincms-1.7.4/feincms/content/video/000077500000000000000000000000001212255543400173565ustar00rootroot00000000000000feincms-1.7.4/feincms/content/video/__init__.py000066400000000000000000000000001212255543400214550ustar00rootroot00000000000000feincms-1.7.4/feincms/content/video/models.py000066400000000000000000000036121212255543400212150ustar00rootroot00000000000000import re from django.db import models from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ class VideoContent(models.Model): """ Copy-paste a URL to youtube or vimeo into the text box, this content type will automatically generate the necessary embed code. Other portals aren't supported currently, but would be easy to add if anyone would take up the baton. You should probably use feincms-oembed. """ PORTALS = ( ('youtube', re.compile(r'youtube'), lambda url: { 'v': re.search(r'([?&]v=|./././)([^#&]+)', url).group(2), }), ('vimeo', re.compile(r'vimeo'), lambda url: { 'id': re.search(r'/(\d+)', url).group(1), }), ('sf', re.compile(r'sf\.tv'), lambda url: { 'id': re.search(r'/([a-z0-9\-]+)', url).group(1), }), ) video = models.URLField(_('video link'), help_text=_('This should be a link to a youtube or vimeo video,' ' i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0')) class Meta: abstract = True verbose_name = _('video') verbose_name_plural = _('videos') def render(self, **kwargs): context_instance = kwargs.get('context') for portal, match, context_fn in self.PORTALS: if match.search(self.video): try: ctx = context_fn(self.video) except AttributeError: continue return render_to_string([ 'content/video/%s.html' % portal, 'content/video/unknown.html', ], dict(ctx, content=self), context_instance=context_instance) return render_to_string('content/video/unknown.html', { 'content': self, }, context_instance=context_instance) feincms-1.7.4/feincms/context_processors.py000066400000000000000000000007041212255543400211170ustar00rootroot00000000000000from feincms.module.page.models import Page def add_page_if_missing(request): """ If this attribute exists, then a page object has been registered already by some other part of the code. We let it decide which page object it wants to pass into the template """ try: return { 'feincms_page': Page.objects.for_request(request, best_match=True), } except Page.DoesNotExist: return {} feincms-1.7.4/feincms/contrib/000077500000000000000000000000001212255543400162365ustar00rootroot00000000000000feincms-1.7.4/feincms/contrib/__init__.py000066400000000000000000000000001212255543400203350ustar00rootroot00000000000000feincms-1.7.4/feincms/contrib/fields.py000066400000000000000000000051351212255543400200620ustar00rootroot00000000000000import json import logging from django import forms from django.db import models from django.core.serializers.json import DjangoJSONEncoder class JSONFormField(forms.fields.CharField): def clean(self, value, *args, **kwargs): if value: try: # Run the value through JSON so we can normalize formatting and at least learn about malformed data: value = json.dumps(json.loads(value), cls=DjangoJSONEncoder) except ValueError: raise forms.ValidationError("Invalid JSON data!") return super(JSONFormField, self).clean(value, *args, **kwargs) class JSONField(models.TextField): """ TextField which transparently serializes/unserializes JSON objects See: http://www.djangosnippets.org/snippets/1478/ """ # Used so to_python() is called __metaclass__ = models.SubfieldBase formfield = JSONFormField def to_python(self, value): """Convert our string value to JSON after we load it from the DB""" if isinstance(value, dict): return value elif isinstance(value, basestring): # Avoid asking the JSON decoder to handle empty values: if not value: return {} try: return json.loads(value) except ValueError: logging.getLogger("feincms.contrib.fields").exception("Unable to deserialize store JSONField data: %s", value) return {} else: assert value is None return {} def get_prep_value(self, value): """Convert our JSON object to a string before we save""" return self._flatten_value(value) def value_to_string(self, obj): """Extract our value from the passed object and return it in string form""" if hasattr(obj, self.attname): value = getattr(obj, self.attname) else: assert isinstance(obj, dict) value = obj.get(self.attname, "") return self._flatten_value(value) def _flatten_value(self, value): """Return either a string, JSON-encoding dict()s as necessary""" if not value: return "" if isinstance(value, dict): value = json.dumps(value, cls=DjangoJSONEncoder) assert isinstance(value, basestring) return value try: from south.modelsinspector import add_introspection_rules JSONField_introspection_rule = ( (JSONField,), [], {}, ) add_introspection_rules(rules=[JSONField_introspection_rule], patterns=["^feincms\.contrib\.fields"]) except ImportError: pass feincms-1.7.4/feincms/contrib/preview/000077500000000000000000000000001212255543400177175ustar00rootroot00000000000000feincms-1.7.4/feincms/contrib/preview/__init__.py000066400000000000000000000000001212255543400220160ustar00rootroot00000000000000feincms-1.7.4/feincms/contrib/preview/urls.py000066400000000000000000000003421212255543400212550ustar00rootroot00000000000000from django.conf.urls import patterns, include, url from feincms.contrib.preview.views import PreviewHandler urlpatterns = patterns('', url(r'^(.*)/_preview/(\d+)/$', PreviewHandler.as_view(), name='feincms_preview'), ) feincms-1.7.4/feincms/contrib/preview/views.py000066400000000000000000000021671212255543400214340ustar00rootroot00000000000000from django.http import Http404 from django.shortcuts import get_object_or_404 from feincms.module.page.models import Page from feincms.views.cbv.views import Handler class PreviewHandler(Handler): """ Preview handler The methods used in this handler should not be considered official API. *** Everything here is subject to change. *** """ def get_object(self): """Get the page by the id in the url here instead.""" page = get_object_or_404(Page, pk=self.args[1]) # Remove _preview/42/ from URL, the rest of the handler code should not # know that anything about previewing. Handler.prepare will still raise # a 404 if the extra_path isn't consumed by any content type self.request.path = page.get_absolute_url() return page def handler(self, request, *args, **kwargs): if not request.user.is_staff: raise Http404('Not found (not allowed)') response = super(PreviewHandler, self).handler(request, *args, **kwargs) response['Cache-Control'] = 'no-cache, must-revalidate, no-store, private' return response feincms-1.7.4/feincms/contrib/richtext.py000066400000000000000000000021211212255543400204360ustar00rootroot00000000000000from django import forms from django.db import models class RichTextFormField(forms.fields.CharField): def __init__(self, *args, **kwargs): super(RichTextFormField, self).__init__(*args, **kwargs) css_class = self.widget.attrs.get('class', '') css_class += ' item-richtext' self.widget.attrs['class'] = css_class def clean(self, value): # TODO add cleansing here? return super(RichTextFormField, self).clean(value) class RichTextField(models.TextField): """ Drop-in replacement for Django's ``models.TextField`` which allows editing rich text instead of plain text in the item editor. """ def formfield(self, form_class=RichTextFormField, **kwargs): return super(RichTextField, self).formfield(form_class=form_class, **kwargs) try: from south.modelsinspector import add_introspection_rules RichTextField_introspection_rule = ( (RichTextField,), [], {}, ) add_introspection_rules(rules=[RichTextField_introspection_rule], patterns=["^feincms\.contrib\.richtext"]) except ImportError: pass feincms-1.7.4/feincms/contrib/tagging.py000066400000000000000000000113721212255543400202340ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ # FeinCMS django-tagging support. To add tagging to your (page) model, # simply do a # # from feincms.contrib import tagging # tagging.tag_model(Page) # ------------------------------------------------------------------------ from __future__ import absolute_import from django import forms from django.contrib.admin.widgets import FilteredSelectMultiple from django.db.models.signals import pre_save from django.utils.translation import ugettext_lazy as _ from tagging.fields import TagField from tagging import AlreadyRegistered # ------------------------------------------------------------------------ def taglist_to_string(taglist): retval = '' if len(taglist) >= 1: taglist.sort() retval = ','.join(taglist) return retval # ------------------------------------------------------------------------ # The following is lifted from: # http://code.google.com/p/django-tagging/issues/detail?id=189 """ TagSelectField A variation of the django-tagging TagField which uses a SelectMultiple widget instead of free text field. class MyModel(models.Model): ... tags = TagSelectField(filter_horizontal=True, blank=False) """ class TagSelectFormField(forms.MultipleChoiceField): def clean(self, value): return taglist_to_string(list(value)) class TagSelectField(TagField): def __init__(self, filter_horizontal=False, *args, **kwargs): super(TagSelectField, self).__init__(*args, **kwargs) self.filter_horizontal = filter_horizontal def formfield(self, **defaults): from tagging.models import Tag from tagging.utils import parse_tag_input if self.filter_horizontal: widget = FilteredSelectMultiple(self.verbose_name, is_stacked=False) else: widget = forms.SelectMultiple() def _render(name, value, attrs=None, *args, **kwargs): value = parse_tag_input(value) return type(widget).render(widget, name, value, attrs, *args, **kwargs) widget.render = _render defaults['widget'] = widget choices = [ (str(t), str(t)) for t in Tag.objects.all() ] return TagSelectFormField(choices=choices, required=not self.blank, **defaults) # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ def pre_save_handler(sender, instance, **kwargs): """ Intercept attempts to save and sort the tag field alphabetically, so we won't have different permutations in the filter list. """ from tagging.utils import parse_tag_input taglist = parse_tag_input(instance.tags) instance.tags = taglist_to_string(taglist) # ------------------------------------------------------------------------ def tag_model(cls, admin_cls=None, field_name='tags', sort_tags=False, select_field=False, auto_add_admin_field=True): """ tag_model accepts a number of named parameters: admin_cls If set to a subclass of ModelAdmin, will insert the tag field into the list_display and list_filter fields. field_name Defaults to "tags", can be used to name your tag field differently. sort_tags Boolean, defaults to False. If set to True, a pre_save handler will be inserted to sort the tag field alphabetically. This is useful in case you want a canonical representation for a tag collection, as when you're presenting a list of tag combinations (e.g. in an admin filter list). select_field If True, show a multi select instead of the standard CharField for tag entry. auto_add_admin_field If True, attempts to add the tag field to the admin class. """ from tagging import register as tagging_register cls.add_to_class(field_name, (select_field and TagSelectField or TagField)(field_name.capitalize(), blank=True)) # use another name for the tag descriptor # See http://code.google.com/p/django-tagging/issues/detail?id=95 for the reason why try: tagging_register(cls, tag_descriptor_attr='tagging_' + field_name) except AlreadyRegistered: return if admin_cls: admin_cls.list_display.append(field_name) admin_cls.list_filter.append(field_name) if auto_add_admin_field and hasattr(admin_cls, 'add_extension_options'): admin_cls.add_extension_options(_('Tagging'), { 'fields': (field_name,) }) if sort_tags: pre_save.connect(pre_save_handler, sender=cls) # ------------------------------------------------------------------------ feincms-1.7.4/feincms/default_settings.py000066400000000000000000000132341212255543400205170ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ """ Default settings for FeinCMS All of these can be overridden by specifying them in the standard ``settings.py`` file. """ from os.path import join from django.conf import settings # ------------------------------------------------------------------------ # Settings for Generic Content # e.g. 'uploads' if you would prefer /uploads/imagecontent/test.jpg # to /imagecontent/test.jpg. FEINCMS_UPLOAD_PREFIX = getattr(settings, 'FEINCMS_UPLOAD_PREFIX', '') # ------------------------------------------------------------------------ # Settings for MediaLibrary #: Local path to newly uploaded media files FEINCMS_MEDIALIBRARY_UPLOAD_TO = getattr(settings, 'FEINCMS_MEDIALIBRARY_UPLOAD_TO', 'medialibrary/%Y/%m/') #: Thumbnail function for suitable mediafiles. Only receives the media file #: and should return a thumbnail URL (or nothing). FEINCMS_MEDIALIBRARY_THUMBNAIL = getattr(settings, 'FEINCMS_MEDIALIBRARY_THUMBNAIL', 'feincms.module.medialibrary.thumbnail.default_admin_thumbnail') # ------------------------------------------------------------------------ # Settings for RichText FEINCMS_RICHTEXT_INIT_TEMPLATE = getattr(settings, 'FEINCMS_RICHTEXT_INIT_TEMPLATE', 'admin/content/richtext/init_tinymce.html') FEINCMS_RICHTEXT_INIT_CONTEXT = getattr(settings, 'FEINCMS_RICHTEXT_INIT_CONTEXT', { 'TINYMCE_JS_URL': join(settings.MEDIA_URL, 'js/tiny_mce/tiny_mce.js'), 'TINYMCE_CONTENT_CSS_URL': None, 'TINYMCE_LINK_LIST_URL': None }) # ------------------------------------------------------------------------ # Admin media settings #: avoid jQuery conflicts -- scripts should use feincms.jQuery instead of $ FEINCMS_JQUERY_NO_CONFLICT = getattr(settings, 'FEINCMS_JQUERY_NO_CONFLICT', False) # ------------------------------------------------------------------------ # Settings for the page module #: Include ancestors in filtered tree editor lists FEINCMS_TREE_EDITOR_INCLUDE_ANCESTORS = getattr(settings, 'FEINCMS_TREE_EDITOR_INCLUDE_ANCESTORS', False) #: Show frontend-editing button? FEINCMS_FRONTEND_EDITING = getattr(settings, 'FEINCMS_FRONTEND_EDITING', False) #: Enable checking of object level permissions. Note that if this option is #: enabled, you must plug in an authentication backend that actually does #: implement object level permissions or no page will be editable. FEINCMS_TREE_EDITOR_OBJECT_PERMISSIONS = getattr(settings, 'FEINCMS_TREE_EDITOR_OBJECT_PERMISSIONS', False) #: When enabled, the page module is automatically registered with Django's #: default admin site (this is activated by default). FEINCMS_USE_PAGE_ADMIN = getattr(settings, 'FEINCMS_USE_PAGE_ADMIN', True) # ------------------------------------------------------------------------ # Various settings # ------------------------------------------------------------------------ #: Allow random gunk after a valid page? FEINCMS_ALLOW_EXTRA_PATH = getattr(settings, 'FEINCMS_ALLOW_EXTRA_PATH', False) # ------------------------------------------------------------------------ #: How to switch languages. #: * ``'STANDARD'``: The page a user navigates to sets the site's language #: and overwrites whatever was set before. #: * ``'EXPLICIT'``: The language set has priority, may only be overridden #: by explicitely a language with ``?set_language=xx``. FEINCMS_TRANSLATION_POLICY = getattr(settings, 'FEINCMS_TRANSLATION_POLICY', 'STANDARD') # ------------------------------------------------------------------------ # Settings for HTML validation #: If True, HTML will be run through a tidy function before saving: FEINCMS_TIDY_HTML = getattr(settings, 'FEINCMS_TIDY_HTML', False) #: If True, displays form validation errors so the user can see how their #: HTML has been changed: FEINCMS_TIDY_SHOW_WARNINGS = getattr(settings, 'FEINCMS_TIDY_SHOW_WARNINGS', True) #: If True, users will be allowed to ignore HTML warnings (errors are always #: blocked): FEINCMS_TIDY_ALLOW_WARNINGS_OVERRIDE = getattr(settings, 'FEINCMS_TIDY_ALLOW_WARNINGS_OVERRIDE', True) #: Name of the tidy function - anything which takes ``(html)`` and returns #: ``(html, errors, warnings)`` can be used: FEINCMS_TIDY_FUNCTION = getattr(settings, 'FEINCMS_TIDY_FUNCTION', 'feincms.utils.html.tidy.tidy_html') # ------------------------------------------------------------------------ #: Makes the page handling mechanism try to find a cms page with that #: path if it encounters a page not found situation. This allows for nice #: customised cms-styled error pages. Do not go overboard, this should #: be as simple and as error resistant as possible, so refrain from #: deeply nested error pages or advanced content types. FEINCMS_CMS_404_PAGE = getattr(settings, 'FEINCMS_CMS_404_PAGE', None) # ------------------------------------------------------------------------ #: When uploading files to the media library, replacing an existing entry, #: try to save the new file under the old file name in order to keep the #: media file path (and thus the media url) constant. #: Experimental, this might not work with all storage backends. FEINCMS_MEDIAFILE_OVERWRITE = getattr(settings, 'FEINCMS_MEDIAFILE_OVERWRITE', False) # ------------------------------------------------------------------------ #: Prefix for thumbnails. Set this to something non-empty to separate thumbs #: from uploads. The value should end with a slash, but this is not enforced. FEINCMS_THUMBNAIL_DIR = getattr(settings, 'FEINCMS_THUMBNAIL_DIR', '_thumbs/') # ------------------------------------------------------------------------ feincms-1.7.4/feincms/extensions.py000066400000000000000000000151611212255543400173530ustar00rootroot00000000000000""" Base types for extensions refactor """ import re import warnings from django.contrib import admin from django.core.exceptions import ImproperlyConfigured from feincms.utils import get_object class ExtensionsMixin(object): @property def _feincms_extensions(self): warnings.warn( 'Start using _extensions instead of _feincms_extensions' ' today!', DeprecationWarning, stacklevel=2) return set(self._extensions) @classmethod def register_extensions(cls, *extensions): """ Register all extensions passed as arguments. Extensions should be specified as a string to the python module containing the extension. If it is a bundled extension of FeinCMS, you do not need to specify the full python module path -- only specifying the last part (f.e. ``'seo'`` or ``'translations'``) is sufficient. """ if not hasattr(cls, '_extensions'): cls._extensions = [] cls._extensions_seen = [] here = cls.__module__.split('.')[:-1] search_paths = [ '.'.join(here + ['extensions']), '.'.join(here[:-1] + ['extensions']), 'feincms.module.extensions', ] for ext in extensions: if ext in cls._extensions: continue extension = None if isinstance(ext, basestring): paths = [ext, '%s.register' % ext] for path in search_paths: paths.extend([ '%s.%s.register' % (path, ext), '%s.%s' % (path, ext), ]) for idx, path in enumerate(paths): try: extension = get_object(path) if idx >= 2: warnings.warn( 'Using short names for extensions has been' ' deprecated and will be removed in' ' FeinCMS v1.8. Please provide the full' ' python path to the extension' ' %s instead (%s).' % ( ext, re.sub(r'\.register$', '', path), ), DeprecationWarning, stacklevel=2) break except (AttributeError, ImportError, ValueError): pass if not extension: raise ImproperlyConfigured( '%s is not a valid extension for %s' % ( ext, cls.__name__)) if hasattr(extension, 'Extension'): extension = extension.Extension elif hasattr(extension, 'register'): extension = extension.register elif hasattr(extension, '__call__'): pass else: raise ImproperlyConfigured( '%s is not a valid extension for %s' % ( ext, cls.__name__)) if extension in cls._extensions_seen: continue cls._extensions_seen.append(extension) if hasattr(extension, 'handle_model'): cls._extensions.append(extension(cls)) else: cls._extensions.append(LegacyExtension(cls, extension=extension)) class Extension(object): def __init__(self, model, **kwargs): self.model = model for key, value in kwargs.items(): if not hasattr(self, key): raise TypeError('%s() received an invalid keyword %r' % ( self.__class__.__name__, key)) setattr(self, key, value) self.handle_model() def handle_model(self): raise NotImplementedError def handle_modeladmin(self, modeladmin): pass class LegacyExtension(Extension): """ Wrapper for legacy extensions """ #: Legacy extension function extension = None def handle_model(self): self.fieldsets = [] self.filter_horizontal = [] self.filter_vertical = [] self.list_display = [] self.list_filter = [] self.raw_id_fields = [] self.search_fields = [] self.extension_options = [] self.known_keys = self.__dict__.keys() self.extension(self.model, self) def handle_modeladmin(self, modeladmin): if self.fieldsets: modeladmin.fieldsets.extend(self.fieldsets) if self.filter_horizontal: modeladmin.filter_horizontal.extend(self.filter_horizontal) if self.filter_vertical: modeladmin.filter_vertical.extend(self.filter_vertical) if self.list_display: modeladmin.list_display.extend(self.list_display) if self.list_filter: modeladmin.list_filter.extend(self.list_filter) if self.raw_id_fields: modeladmin.raw_id_fields.extend(self.raw_id_fields) if self.search_fields: modeladmin.search_fields.extend(self.search_fields) if self.extension_options: for f in self.extension_options: modeladmin.add_extension_options(*f) for key, value in self.__dict__.items(): if key not in self.known_keys: setattr(modeladmin.__class__, key, value) def add_extension_options(self, *f): if f: self.extension_options.append(f) class ExtensionModelAdmin(admin.ModelAdmin): def __init__(self, *args, **kwargs): super(ExtensionModelAdmin, self).__init__(*args, **kwargs) self.initialize_extensions() def initialize_extensions(self): if not hasattr(self, '_extensions_initialized'): self._extensions_initialized = True for extension in getattr(self.model, '_extensions', []): extension.handle_modeladmin(self) def add_extension_options(self, *f): if self.fieldsets is None: return if isinstance(f[-1], dict): # called with a fieldset self.fieldsets.insert(self.fieldset_insertion_index, f) f[1]['classes'] = list(f[1].get('classes', [])) f[1]['classes'].append('collapse') elif f: # assume called with "other" fields try: self.fieldsets[1][1]['fields'].extend(f) except IndexError: # Fall back to first fieldset if second does not exist # XXX This is really messy. self.fieldsets[0][1]['fields'].extend(f) feincms-1.7.4/feincms/locale/000077500000000000000000000000001212255543400160355ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/ca/000077500000000000000000000000001212255543400164205ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/ca/LC_MESSAGES/000077500000000000000000000000001212255543400202055ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/ca/LC_MESSAGES/django.mo000066400000000000000000000317721212255543400220160ustar00rootroot00000000000000\  `2H$d 9 1(.5< T_Dr  ff&   t(# 45-cs   8  4   %*16L[  #:?DG,1?.qc237kr xGI#;C JVj          %16;AIQW _js x         0< M[mr     $ 1 = JV ]g |   # 8 G T Y \ b m t  Q"c"x"%"">" #%#;#D#,I#v#|### ##H# $ $($=$L$yb$&$%%/%L%[%p%y% %%% %%A&I&)O&y& &&9&8& '0'E'T'Z'b' z'''' Z(Fg((((( ((>)") ))#*5*>*F*%M*Cs*Z*++"+*+;+B+0S++ +F++0p,6,E,r-/-;--. .K.Je..... ../-/E/J/ S/ ^/ h/s// /////// / 0000%0.060 ?0 J0W0]0t0 000000 00000 011 41U1e1 v111111 11111112 2'2/2C2S2 \2h2z22222 2222223 33 3 '3 13;3R3k3p3w33 3 3333333$ustT;"4}ZqH&z|kNMc,< _m UnFeCfrlQg=K3[)*w+-8>WY/27G.^B~'`{b jv0pA OVoS\@E!Ry: ?h( ]1dJ9x6P#%DILa5iX %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%s has been moved to a new position.(no caption)Add a brief excerpt summarizing the content of this page.Add child pageAdd new itemAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCannot delete itemCannot delete item, because it is parent of at least one other item.CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create hidden copy of this pageCreate translationDate-based publishingDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordMoveMove toNavigation extensionNew comments may be addedNo comments.Other optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.ParentPost CommentPreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyRelated pagesReplace page %(to_replace)sRich TextSaveSearchSearch engine optimizationSelect pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSymlinked pageTarget URL for automatic redirects.TextThanks!The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You have replaced %s. You may continue editing the now-active page below.You may edit the copied page below.actionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich text (ckeditor)rich textsrich texts (ckeditor)rightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FeinCMS Report-Msgid-Bugs-To: POT-Creation-Date: 2010-09-15 14:29+0200 PO-Revision-Date: 2010-09-20 20:39+0100 Last-Translator: antoni aloy Language-Team: ca MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Catalan X-Poedit-SourceCharset: utf-8 X-Poedit-Country: SPAIN %(comment_username)s digué el %(comment_submit_date)s
    Per %(filter_title)s%(comment_count)s comentaris.%s ha sigut mogut a una nova posició(sense llegenda)Afegeix una breu descripció resumint el contingut de la planaAfegeix una plana filla.Afegir un nou elementDesprésTotsTot el contingut es heretat d'aquesta plana.AudioAbansBinariPuja un arxiu ZIP:URL en cachéImpossible esborrar l'elementNo puc esborrar l'element ja que és el pare d'almanco un altre element.CategoriaModificar %sCanviar la plantillaTancar l'arbreConfirma per esborrarEl contingut de la plana pare s'inserirà automàticament. Per sobreescriure aquest comportament afegeix algun contingut.Crea una còpia oculta d'aquesta planaCrear traduccióPublicació segons la dataNo entenc l'odre de movimentEditar al LlocEditar la traduccióExtracteExpandir l'arbreCategoritzatFiltrarFlashHTML TidyLa validació de l'HTML generà %(count)d avisos. Per favor, revisa el contingut actualitzat de la part inferior abans de continuar: %(messages)sOcultarIniciIgnora els avisos de validació de l'HTMLImatgeInserir nou:L'element s'esborrà amb èxit.Si la deixen en blanc l'entrada estarà activa per sempreDeixa aquest camp buid per les entrades en l'idioma baseMicrosoft ExcelMicrosoft PowerPointMicrosoft WordMoureMoure aExtensió de navegacióEs podran afegir nous comentarisSense comentaris.Altres opcionsSobreescriu l'URL. Ha de contenir una '/' a l'inici i al final quan es tracti d'una URL local. Afecta tant a la navegació com a les URLs de les subplanes.document PDFTítol de la plana pel navegador. Per defecte el mateix que el títol.PareEnvia un comentariPrevisualitzarfeed RSSfeeds RSSVols canviar la plantilla?
    Tots els canvis es guardaran i el contingut des de %(source_regions)s se mourà a %(target_region)sVols canviar la plantilla?
    Tots els canvis es guardaran.Segur que vols esborrar l'element?Regió buidaPlanes relacionadesReemplaçar la plana %(to_replace)sText ricGuardarCercarOptimització per als motors de cercaSelecciones les planes que es mostraran com a contingut relacionat.Selecciona el mòdul que proveeix les subplanes si necessites personalitzar la navegació.EnviarDreceresMostrarAcabar l'edicióEnviarPlana enllaçadaURL de destí per les redireccions automàtiquesTextGràcies!La primera línia és el títol principal, les altres són subtítols.El feed RSS s'actualitza varies vegades al dia. Els canvis en el títol sols seran visibles a la plana inicial després de la propera actualització.Aquesta URL ja està en ús en una plana activa.Aquesta URL ja età en ús per una altra plana activa.Això també es fa servir per la navegació generada automàticament.Això ha de ser un enllaç a un vídeo de Youtube o Vimeo. Per exemple: http://www.youtube.com/watch?v=zmj1rpzDRZ0Això serà afegit a la descripció per defecteAixò serà afegit a la llista de paraules clau per defecteTítolsVídeoVeure a LlocS'establirà automàticament quan marquis la casella superior de 'publicat'Has reemplaçat %s. Pots continuar editant la ara plana activa aquí sota.Pots editar la plana copiada just aquí abaix.accionsactiuaplicaciócontingut de l'aplicaciócontinguts de l'aplicaciótraduccions disponiblesblocllegendacategoriescategoriacomentarisformulari de contacteformularis de contactecontinguttítol del continguttipus de contingutdrets de còpiacreatdata de creaciódadesdescripcióavalleditarcorreuactiuentradesentradaextracteextensionscategoritzatarxiuinformació de l'arxiutamany d'arxiutipus d'arxiuarxiusimatgeimatgesa la navegacióheretatés activaidiomadarrera actualitzacióesquerraenlaçnombre màximarxiu de medistraducció de l'arxiu de medistraduccions dels arxius de medisarxius de medismeta descripciómeta paraulesdata de modificaciónomextensió de navegaciónouprivatordenacióURL sobrescritplanatítol de la planaplanespareplàposiciócontingut pre-renderitzatpúblicdata de publicaciópublicar fins apublicatpublicat elcontingut en cruucontinguts en cruuredirecciona aesborrartext rictext rico (ckeditor)texts ricstexts rics (ckeditor)dretaseccióseccionsslugassumptePlana enllaçadataulataulesetiquetesplantillaplantilla de contingutplantilles de contingutstexttítoltítol de la filatítol de fila i columnatradució detraduccionstipusamuntvídeoenllaç de vídeovídeosvisible de-fins afeincms-1.7.4/feincms/locale/ca/LC_MESSAGES/django.po000066400000000000000000000601501212255543400220110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Maarten van Gompel (proycon) , 2009. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: LANGUAGE \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "plantilla" #: models.py:551 msgid "ordering" msgstr "ordenació" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "idioma" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Tots" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Pare" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Categoria" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Modificar %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "títol" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s ha sigut mogut a una nova posició" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "No entenc l'odre de moviment" #: admin/tree_editor.py:417 msgid "actions" msgstr "accions" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Segur que vols esborrar l'element?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "contingut de l'aplicació" #: content/application/models.py:273 msgid "application contents" msgstr "continguts de l'aplicació" #: content/application/models.py:298 msgid "application" msgstr "aplicació" #: content/comments/models.py:24 msgid "enabled" msgstr "actiu" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Es podran afegir nous comentaris" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "comentaris" #: content/comments/models.py:49 msgid "public" msgstr "públic" #: content/comments/models.py:49 msgid "not public" msgstr "privat" #: content/contactform/models.py:18 msgid "name" msgstr "nom" #: content/contactform/models.py:19 msgid "email" msgstr "correu" #: content/contactform/models.py:20 msgid "subject" msgstr "assumpte" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "contingut" #: content/contactform/models.py:34 msgid "contact form" msgstr "formulari de contacte" #: content/contactform/models.py:35 msgid "contact forms" msgstr "formularis de contacte" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "arxiu" #: content/file/models.py:26 msgid "files" msgstr "arxius" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "imatge" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "llegenda" #: content/image/models.py:53 msgid "images" msgstr "imatges" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "posició" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(sense llegenda)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "arxiu de medis" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "arxius de medis" #: content/medialibrary/models.py:139 msgid "block" msgstr "bloc" #: content/medialibrary/models.py:140 msgid "left" msgstr "esquerra" #: content/medialibrary/models.py:141 msgid "right" msgstr "dreta" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "tipus" #: content/raw/models.py:18 msgid "raw content" msgstr "contingut en cruu" #: content/raw/models.py:19 msgid "raw contents" msgstr "continguts en cruu" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Ignora els avisos de validació de l'HTML" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "La validació de l'HTML generà %(count)d avisos. Per favor, revisa el " "contingut actualitzat de la part inferior abans de continuar: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "text" #: content/richtext/models.py:85 msgid "rich text" msgstr "text ric" #: content/richtext/models.py:86 msgid "rich texts" msgstr "texts rics" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "El feed RSS s'actualitza varies vegades al dia. Els canvis en el títol sols " "seran visibles a la plana inicial després de la propera actualització." #: content/rss/models.py:22 msgid "link" msgstr "enlaç" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "contingut pre-renderitzat" #: content/rss/models.py:24 msgid "last updated" msgstr "darrera actualització" #: content/rss/models.py:25 msgid "max. items" msgstr "nombre màxim" #: content/rss/models.py:29 msgid "RSS feed" msgstr "feed RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "feeds RSS" #: content/section/models.py:41 msgid "section" msgstr "secció" #: content/section/models.py:42 msgid "sections" msgstr "seccions" #: content/table/models.py:66 msgid "plain" msgstr "plà" #: content/table/models.py:67 msgid "title row" msgstr "títol de la fila" #: content/table/models.py:69 msgid "title row and column" msgstr "títol de fila i columna" #: content/table/models.py:75 msgid "table" msgstr "taula" #: content/table/models.py:76 msgid "tables" msgstr "taules" #: content/table/models.py:90 msgid "data" msgstr "dades" #: content/template/models.py:51 msgid "template content" msgstr "plantilla de contingut" #: content/template/models.py:52 msgid "template contents" msgstr "plantilles de continguts" #: content/video/models.py:25 msgid "video link" msgstr "enllaç de vídeo" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Això ha de ser un enllaç a un vídeo de Youtube o Vimeo. Per exemple: http://" "www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "vídeo" #: content/video/models.py:31 msgid "videos" msgstr "vídeos" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "publicat" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Això també es fa servir per la navegació generada automàticament." #: module/blog/models.py:33 msgid "published on" msgstr "publicat el" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "S'establirà automàticament quan marquis la casella superior de 'publicat'" #: module/blog/models.py:39 msgid "entry" msgstr "entrada" #: module/blog/models.py:40 msgid "entries" msgstr "entrades" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "etiquetes" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "tradució de" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Deixa aquest camp buid per les entrades en l'idioma base" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "traduccions disponibles" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "data de creació" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "data de modificació" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "tipus de contingut" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "data de publicació" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "publicar fins a" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Si la deixen en blanc l'entrada estarà activa per sempre" #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "visible de-fins a" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Publicació segons la data" #: module/extensions/featured.py:9 msgid "featured" msgstr "categoritzat" #: module/extensions/featured.py:14 msgid "Featured" msgstr "Categoritzat" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta paraules" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Això serà afegit a la llista de paraules clau per defecte" #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta descripció" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Això serà afegit a la descripció per defecte" #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Optimització per als motors de cerca" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Editar la traducció" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Crear traducció" #: module/extensions/translations.py:200 msgid "translations" msgstr "traduccions" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Previsualitzar" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "tamany d'arxiu" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "creat" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "tipus d'arxiu" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "informació de l'arxiu" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "pare" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "categoria" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "categories" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "drets de còpia" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Imatge" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Vídeo" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Audio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "document PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Text" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Text ric" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binari" #: module/medialibrary/models.py:236 msgid "description" msgstr "descripció" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "traducció de l'arxiu de medis" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "traduccions dels arxius de medis" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Aquesta URL ja està en ús en una plana activa." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Aquesta URL ja età en ús per una altra plana activa." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Altres opcions" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "a la navegació" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Afegeix una plana filla." #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Veure a Lloc" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "heretat" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "extensions" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "és activa" #: module/page/models.py:138 msgid "active" msgstr "actiu" #: module/page/models.py:146 msgid "override URL" msgstr "URL sobrescrit" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Sobreescriu l'URL. Ha de contenir una '/' a l'inici i al final quan es " "tracti d'una URL local. Afecta tant a la navegació com a les URLs de les " "subplanes." #: module/page/models.py:148 msgid "redirect to" msgstr "redirecciona a" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL de destí per les redireccions automàtiques" #: module/page/models.py:150 msgid "Cached URL" msgstr "URL en caché" #: module/page/models.py:161 msgid "page" msgstr "plana" #: module/page/models.py:162 msgid "pages" msgstr "planes" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "extracte" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "Afegeix una breu descripció resumint el contingut de la plana" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Extracte" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "extensió de navegació" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Selecciona el mòdul que proveeix les subplanes si necessites personalitzar " "la navegació." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "Extensió de navegació" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Selecciones les planes que es mostraran com a contingut relacionat." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Planes relacionades" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "Plana enllaçada" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Tot el contingut es heretat d'aquesta plana." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "títol del contingut" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "La primera línia és el títol principal, les altres són subtítols." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "títol de la plana" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "Títol de la plana pel navegador. Per defecte el mateix que el títol." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Títols" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "Per %(filter_title)s" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Cercar" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Segur que vols esborrar l'element?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Confirma per esborrar" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "L'element s'esborrà amb èxit." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Impossible esborrar l'element" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "No puc esborrar l'element ja que és el pare d'almanco un altre element." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Canviar la plantilla" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Vols canviar la plantilla?
    Tots els canvis es guardaran." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Vols canviar la plantilla?
    Tots els canvis es guardaran i el contingut " "des de %(source_regions)s se mourà a " "%(target_region)s" #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Ocultar" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Mostrar" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Després" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Abans" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Inserir nou:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Regió buida" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "El contingut de la plana pare s'inserirà automàticament. Per sobreescriure " "aquest comportament afegeix algun contingut." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Afegir un nou element" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Guardar" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Acabar l'edició" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "editar" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nou" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "amunt" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "avall" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "esborrar" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Inici" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Dreceres" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Tancar l'arbre" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Expandir l'arbre" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtrar" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Editar al Lloc" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Puja un arxiu ZIP:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Enviar" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s comentaris." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s digué el %(comment_submit_date)s
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Sense comentaris." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Envia un comentari" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Enviar" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Gràcies!" #~ msgid "Symlinked page" #~ msgstr "Plana enllaçada" feincms-1.7.4/feincms/locale/cs/000077500000000000000000000000001212255543400164425ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/cs/LC_MESSAGES/000077500000000000000000000000001212255543400202275ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/cs/LC_MESSAGES/django.mo000066400000000000000000000325051212255543400220330ustar00rootroot000000000000004L hi:$ %4 P$]1Da9  f3F&\  ' t[`h#m 45# =J ^l  8"[ bBoD 4   #;@Gb6|[  #0r7#TDBA,O1|.c2A3t G<A\t    + 3 AO W eqv{         # .9P ht       % , = R \ i u             !! !!+! :!G!L!O! U!`!g!y!";#Z#s# ####'# $1!$S$h$k$@p$$ $$@$X % y% %% %c%&&?&[& r& |&6& && &p&T'\'e'&k'''B'0'(5(J(_(x(( ) ))I6)))D)J))* 1* <*H*9*+;+O+d+j++++++W+8,?,G,O,`,h,, -0-@-BG->-H-k.,~.)./.b/(h/4///T/<80u0000000011%1 ,1 61 @1L1b1y1 1 1 111111111 1 12 22 +272?2H2 Q2 \2 g2s2y222 22222 33 *383?3V3 \3h3 q33333333 333 3 44#444C4J4Q4W4 ]4g4{44444444444 4 5 555)505T&^;jK4d]_-\M nXzSYQI@.N 53wFc?>+ Ris('WOPbk7a[q=upU"1J)L{6:|~!*vG9#0lfeA $ox%D}B</CrHZ y2,VtEmg`8 h%(comment_count)s comments.%(comment_username)s said on %(comment_submit_date)s
    %d files imported%s has been moved to a new position.(no caption)AddAdd another %(verbose_name)sAdd child pageAdd media files to categoryAdd new itemAdd selected media files to categoryAdd to categoryAfterAllAll content is inherited from this page if given.BeforeBinaryBulk upload a ZIP file:Cannot delete item, because it is parent of at least one other item.Cannot overwrite with different file type (attempt to overwrite a %(old_ext)s with a %(new_ext)s)CategoryChange %sChange templateCollapse treeContent from the parent site is automatically inherited. To override this behaviour, add some content.Create translationDate-based publishingDid not understand moving instruction.Edit on siteExcerptExpand treeExport selected media files as zip fileFeaturedFilterHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHistoryHomeIgnore the HTML validation warningsImageInsert new:Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Navigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.OverwritePDF documentPage title for browser window. Same as title by default.ParentPost CommentPress the save button below to recover this version of the object.Press the save button below to revert to this version of the object.PreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Recover deleted %(verbose_name)sRegion emptyRelated pagesRemoveRevert %(verbose_name)sSaveSearchSearch engine optimizationSelect category to apply:Select pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSuccessfully added %(count)d media file to %(category)s.Successfully added %(count)d media files to %(category)s.Symlinked pageTaggingTarget URL for automatic redirects.Thanks!The content from the original translation has been copied to the newly created page.The first line is the main title, the following lines are subtitles.The following media files will be added to the selected category:The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesView on siteWill be set automatically once you tick the `published` checkbox above.You don't have the necessary permissions to edit this objectZIP file export failed: %sZIP file exported as %sZIP import failed: %sactionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescreatedcreation datedescriptiondowneditemailenabledentriesentryextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverightsectionsectionssubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2012-05-08 19:16+0200 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2 %(comment_count)s komentářů%(comment_username)s řekl v %(comment_submit_date)s
    %d souborů importováno%s přesunut na novou pozici(bez názvu)PřidejPřidej nové %(verbose_name)sPřidej podřízenou stránkuPřidej mediální soubory do kategoriePřidej novou položkuPřiděj vybrané mediální soubory do kategoriePřidej do kategoriePovšeVšechen obsah je poděděn do této stránky, pakliže vybránaPředBinárníNahrát dávku v ZIP souboru:Nemůžeš smazat tuto položku, protože má podřazená jiné.Nemůže být přepsán jiným typem (pokoušíš se přepsat %(old_ext)s s %(new_ext)s)kategoriezměň %sZměň šablonuRozbal stromObsah z nadřazené stránky je automaticky zděděn. Přidej nějaký obsah, který ho přepíše.Vytvoř překladPublikování na základě dataNesrozumitelné přesunutíEdituj přímo na webuvýňatekZabal stromVyexportuj vybrané mediální soubory jako zip archivzvýrazněnýFiltrujčisté HTML HTML validace vyplivla %(count)d varování. Prosím zkontroluj obsah níže před pokračováním: %(messages)sSchovatHistorieDomůignorovat HTML validační varovnáníobrázekPřidat novou:Nech prázdné pro články, které mají být publikovány stáleNech prázdné pro články v primárním jazycerozšíření navigaceKomentáře povolenyŽádné komentářeŽádný vstupní souborDalší nastaveníPřepíše cílové URL. Ujisti se, že máš "/" na začátku a na konci pro lokální URL.Toto ovlivňuje navigaci cílové stránky i podstránekPřepsatPDF dokumentTitulek pro okno prohlížeče. Výchozí: stejné jako titulek stránky.rodičPoslat komentářZmáčkni tlačítko ulož níže pro obnovení této verze objektu.Zmáčkni tlačítko ulož níže pro revertování na tuto verzi objektu.náhledRSS kanálRSS kanályOpravdu změnit šablonu?
    Všechny změny uloženy a obsah %(source_regions)s je přesunut do %(target_region)s.Opravdu změnit šablonu?
    Všechny změny uloženy.Obnov smazané %(verbose_name)sRegion je prázdnýPříbuzné stránkySmažRevertuj %(verbose_name)sUložVyhledatOptimalizace pro vyhledávačeVytvoř kategorii:Vyber příbuzné stránkyVyber modul nabízející podstránky pro tuto stránku jestli chceš upravit navigaci.PoslatZkratkyUkázatUkončit editaciOdeslatÚspěšně přidáno %(count)d mediálních souborů do %(category)s.Úspěšně přidáno %(count)d mediálních souborů do %(category)s.Propojená stránkaTagyCílová adresa pro automatické přeměrováníDíky!Originálnío překlad zkopírován do nově vytvořené stránky.První řádka je hlavní titulek, ostatní řádky podtitulkyNásledující mediální soubory budou přidány do vybrané kategorie:RSS pole je měněno několikrát za den. Změna v titulku bude patrná při přístí změně RSS kanálu.Toto URL je už obsazeno aktivní stránkou.Toto URL je už obsazeno jinou stránkou.Toto je také použito pro generovanou navigaciToto má být odkaz na youtube nebo vimeo video, např. http://www.youtube.com/watch?v=zmj1rpzDRZ0Toto bude přidáno k výchozímu popisuToto bude přidáno k výchozím klíčovým slovůmTitulkyZobrazena na sajtě.Bude automaticky nastaven jakmile klikneš na zaškrtávátko `publikovaný` výše.Nemáte dostatečná oprávnění pro editaci tohoto objektuexport ZIP archivu selhal: %sZIP archiv exporotován jako %simport ZIPu selhal: %sakceaktivníaplikaceaplikační obsahaplikační obsahypřeklady k dispozicido blokunázevkategoriekategoriekomentářekontaktní formulářkontaktní formulářeobsahNázev obsahutypy obsahuvytvorenodatum vytvořenípopisdolůeditujmailzapnutýČlánkyČlánekrozšířenízvýrazněnýsouborinfo o souboruvelikost souborutyp souborusouboryobrázekobrázkyv navigacizděděnýje aktivníjazyknaposledy změněnovlevoodkazmax. položekmediální souborpřeklad mediálního souborupřeklady mediálního souborumediální souborymeta popismeta klíčová slovadatum úpravyjménorozšíření navigacenovýneveřejnýřazenívynucené URLstránkatitulek stránkystránkyrodičprostýpozicepredrenderovaný obsahveřejnýdatum publikacekonec publikacepublikovanýpublikovanýbinární obsahbinární obsahypřesměruj naodebervpravosekcesekcepředmětpropojená stránkatabulkatabulkytagyšablonašablonový obsahšablonové obsahytextNázevtitulní řádkatitulní řádka a sloupecpřekladpřekladytypnahoruvideoodkaz na videovideoaPublikováno od - dofeincms-1.7.4/feincms/locale/cs/LC_MESSAGES/django.po000066400000000000000000000607241212255543400220420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "šablona" #: models.py:551 msgid "ordering" msgstr "řazení" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "jazyk" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "vše" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "rodič" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "kategorie" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "změň %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "Název" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s přesunut na novou pozici" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "Nesrozumitelné přesunutí" #: admin/tree_editor.py:417 msgid "actions" msgstr "akce" #: admin/tree_editor.py:429 #, python-format msgid "Successfully deleted %s items." msgstr "" #: admin/tree_editor.py:437 #, fuzzy, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "Obnov smazané %(verbose_name)s" #: content/application/models.py:272 msgid "application content" msgstr "aplikační obsah" #: content/application/models.py:273 msgid "application contents" msgstr "aplikační obsahy" #: content/application/models.py:298 msgid "application" msgstr "aplikace" #: content/comments/models.py:24 msgid "enabled" msgstr "zapnutý" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Komentáře povoleny" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "komentáře" #: content/comments/models.py:49 msgid "public" msgstr "veřejný" #: content/comments/models.py:49 msgid "not public" msgstr "neveřejný" #: content/contactform/models.py:18 msgid "name" msgstr "jméno" #: content/contactform/models.py:19 msgid "email" msgstr "mail" #: content/contactform/models.py:20 msgid "subject" msgstr "předmět" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "obsah" #: content/contactform/models.py:34 msgid "contact form" msgstr "kontaktní formulář" #: content/contactform/models.py:35 msgid "contact forms" msgstr "kontaktní formuláře" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "soubor" #: content/file/models.py:26 msgid "files" msgstr "soubory" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "obrázek" #: content/image/models.py:46 #, fuzzy msgid "alternate text" msgstr "šablonový obsah" #: content/image/models.py:47 #, fuzzy msgid "Description of image" msgstr "popis" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "název" #: content/image/models.py:53 msgid "images" msgstr "obrázky" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "pozice" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(bez názvu)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "mediální soubor" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "mediální soubory" #: content/medialibrary/models.py:139 msgid "block" msgstr "do bloku" #: content/medialibrary/models.py:140 msgid "left" msgstr "vlevo" #: content/medialibrary/models.py:141 msgid "right" msgstr "vpravo" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "typ" #: content/raw/models.py:18 msgid "raw content" msgstr "binární obsah" #: content/raw/models.py:19 msgid "raw contents" msgstr "binární obsahy" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "čisté HTML " #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "ignorovat HTML validační varovnání" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "HTML validace vyplivla %(count)d varování. Prosím zkontroluj obsah níže před " "pokračováním: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "text" #: content/richtext/models.py:85 msgid "rich text" msgstr "" #: content/richtext/models.py:86 msgid "rich texts" msgstr "" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "RSS pole je měněno několikrát za den. Změna v titulku bude patrná při přístí " "změně RSS kanálu." #: content/rss/models.py:22 msgid "link" msgstr "odkaz" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "predrenderovaný obsah" #: content/rss/models.py:24 msgid "last updated" msgstr "naposledy změněno" #: content/rss/models.py:25 msgid "max. items" msgstr "max. položek" #: content/rss/models.py:29 msgid "RSS feed" msgstr "RSS kanál" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "RSS kanály" #: content/section/models.py:41 msgid "section" msgstr "sekce" #: content/section/models.py:42 msgid "sections" msgstr "sekce" #: content/table/models.py:66 msgid "plain" msgstr "prostý" #: content/table/models.py:67 msgid "title row" msgstr "titulní řádka" #: content/table/models.py:69 msgid "title row and column" msgstr "titulní řádka a sloupec" #: content/table/models.py:75 msgid "table" msgstr "tabulka" #: content/table/models.py:76 msgid "tables" msgstr "tabulky" #: content/table/models.py:90 msgid "data" msgstr "" #: content/template/models.py:51 msgid "template content" msgstr "šablonový obsah" #: content/template/models.py:52 msgid "template contents" msgstr "šablonové obsahy" #: content/video/models.py:25 msgid "video link" msgstr "odkaz na video" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Toto má být odkaz na youtube nebo vimeo video, např. http://www.youtube.com/" "watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "video" #: content/video/models.py:31 msgid "videos" msgstr "videoa" #: contrib/tagging.py:117 msgid "Tagging" msgstr "Tagy" #: module/blog/models.py:28 msgid "published" msgstr "publikovaný" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Toto je také použito pro generovanou navigaci" #: module/blog/models.py:33 msgid "published on" msgstr "publikovaný" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Bude automaticky nastaven jakmile klikneš na zaškrtávátko `publikovaný` výše." #: module/blog/models.py:39 msgid "entry" msgstr "Článek" #: module/blog/models.py:40 msgid "entries" msgstr "Články" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "tagy" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "překlad" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Nech prázdné pro články v primárním jazyce" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "překlady k dispozici" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "datum vytvoření" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "datum úpravy" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "typy obsahu" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "datum publikace" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "konec publikace" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Nech prázdné pro články, které mají být publikovány stále" #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "Publikováno od - do" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Publikování na základě data" #: module/extensions/featured.py:9 msgid "featured" msgstr "zvýrazněný" #: module/extensions/featured.py:14 msgid "Featured" msgstr "zvýrazněný" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta klíčová slova" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Toto bude přidáno k výchozím klíčovým slovům" #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta popis" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Toto bude přidáno k výchozímu popisu" #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Optimalizace pro vyhledávače" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Vytvoř překlad" #: module/extensions/translations.py:200 msgid "translations" msgstr "překlady" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" "Nemůže být přepsán jiným typem (pokoušíš se přepsat %(old_ext)s s " "%(new_ext)s)" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "Úspěšně přidáno %(count)d mediálních souborů do %(category)s." msgstr[1] "Úspěšně přidáno %(count)d mediálních souborů do %(category)s." #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "Přiděj vybrané mediální soubory do kategorie" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "ZIP archiv exporotován jako %s" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "export ZIP archivu selhal: %s" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "Vyexportuj vybrané mediální soubory jako zip archiv" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "náhled" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "velikost souboru" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "vytvoreno" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "typ souboru" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "info o souboru" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "%d souborů importováno" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "import ZIPu selhal: %s" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "Žádný vstupní soubor" #: module/medialibrary/models.py:43 msgid "parent" msgstr "rodič" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "" #: module/medialibrary/models.py:49 msgid "category" msgstr "kategorie" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "kategorie" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "" #: module/medialibrary/models.py:202 msgid "Image" msgstr "obrázek" #: module/medialibrary/models.py:203 msgid "Video" msgstr "" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "PDF dokument" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "" #: module/medialibrary/models.py:207 msgid "Text" msgstr "" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binární" #: module/medialibrary/models.py:236 msgid "description" msgstr "popis" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "překlad mediálního souboru" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "překlady mediálního souboru" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Toto URL je už obsazeno aktivní stránkou." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Toto URL je už obsazeno jinou stránkou." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Další nastavení" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "v navigaci" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Přidej podřízenou stránku" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Zobrazena na sajtě." #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "Originálnío překlad zkopírován do nově vytvořené stránky." #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "Nemáte dostatečná oprávnění pro editaci tohoto objektu" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "zděděný" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "rozšíření" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "je aktivní" #: module/page/models.py:138 msgid "active" msgstr "aktivní" #: module/page/models.py:146 msgid "override URL" msgstr "vynucené URL" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Přepíše cílové URL. Ujisti se, že máš \"/\" na začátku a na konci pro " "lokální URL.Toto ovlivňuje navigaci cílové stránky i podstránek" #: module/page/models.py:148 msgid "redirect to" msgstr "přesměruj na" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "Cílová adresa pro automatické přeměrování" #: module/page/models.py:150 msgid "Cached URL" msgstr "" #: module/page/models.py:161 msgid "page" msgstr "stránka" #: module/page/models.py:162 msgid "pages" msgstr "stránky" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "výňatek" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "rozšíření navigace" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Vyber modul nabízející podstránky pro tuto stránku jestli chceš upravit " "navigaci." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "rozšíření navigace" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Vyber příbuzné stránky" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Příbuzné stránky" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "propojená stránka" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Všechen obsah je poděděn do této stránky, pakliže vybrána" #: module/page/extensions/titles.py:13 msgid "content title" msgstr "Název obsahu" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "První řádka je hlavní titulek, ostatní řádky podtitulky" #: module/page/extensions/titles.py:15 msgid "page title" msgstr "titulek stránky" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "Titulek pro okno prohlížeče. Výchozí: stejné jako titulek stránky." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Titulky" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Vyhledat" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "" #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "Nemůžeš smazat tuto položku, protože má podřazená jiné." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Změň šablonu" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Opravdu změnit šablonu?
    Všechny změny uloženy." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Opravdu změnit šablonu?
    Všechny změny uloženy a obsah " "%(source_regions)s je přesunut do %(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Schovat" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Ukázat" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Po" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Před" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Přidat novou:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Region je prázdný" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Obsah z nadřazené stránky je automaticky zděděn. Přidej nějaký obsah, který " "ho přepíše." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Přidej novou položku" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "Přidej nové %(verbose_name)s" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "Smaž" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Ulož" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Ukončit editaci" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "edituj" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nový" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "nahoru" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "dolů" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "odeber" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Domů" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "Obnov smazané %(verbose_name)s" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "Zmáčkni tlačítko ulož níže pro obnovení této verze objektu." #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "Historie" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "Revertuj %(verbose_name)s" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "Zmáčkni tlačítko ulož níže pro revertování na tuto verzi objektu." #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Zkratky" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Rozbal strom" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Zabal strom" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtruj" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Edituj přímo na webu" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "Přidej" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "Přidej mediální soubory do kategorie" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "Vytvoř kategorii:" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "Následující mediální soubory budou přidány do vybrané kategorie:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "Přidej do kategorie" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Nahrát dávku v ZIP souboru:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "Přepsat" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Poslat" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s komentářů" #: templates/content/comments/default.html:18 #, fuzzy, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "%(comment_username)s řekl v %(comment_submit_date)s
    " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Žádné komentáře" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Poslat komentář" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Odeslat" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Díky!" #~ msgid "Symlinked page" #~ msgstr "Propojená stránka" feincms-1.7.4/feincms/locale/de/000077500000000000000000000000001212255543400164255ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/de/LC_MESSAGES/000077500000000000000000000000001212255543400202125ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/de/LC_MESSAGES/django.mo000066400000000000000000000354541212255543400220240ustar00rootroot00000000000000% @`A$ 9Ifu $1# ;FMD`a  *8fO& :GX `'l t).6#;_ eq45+@ Zg { ( 28?x BD %/4  4 AOV nx}6[E JT Yfrm@@EDMA,Z1.c2L3) G<? |       !$!;! C!N!W! `! m!{! ! ! !! !! !!!!!!!! ! "" " !" +"5";"B"H" O" ]" g"q" z"" " """ "" ""##(# ,#7# @#M# R#]#c#j#p#y#### # # # # ## # $$$$$)$1$@$F$M$R$[$l$~$$ $$$ $$$$ $$$@$>7&v&&&*& &)&%#'I'&`''%''''J'8(>( E(Q(o( ((E(h( ]) g)r))')d) *>* U*v******.*&+.+5+ ;+E+ ++ +%+ ,,!,6@,=w,,,,,+---?-U-f-. .K+. w..P.L.8/A/ J/T/E0F05a0 00 0200001H-1Av111111i1[2:r222B2L2I353=48Q4n4A4@;54|5555?586#P6t66 6666 6 6 667 7 )7 37>7N7_7 f7 s7 77 77 77 77 7 777 778 8 8!8*82898>8E8N8U8[8c8y8~8 888 88 8 8 99'9+9 =9H9\9 b9n9 u999999999 : :: .:8:=:C: K:U:Z:b:s:{:::: ::: ::::::: ;;; BfF8eup0 CXli`Wr' D6Axz-TwMg@7_!1=tyIqG"Sa +Jbkd:/mP;h4RKn9\H#[${Q,.N3E})?V%52<>OUs~c]*^&Y(Zo Lv|j %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%d files imported%s has been moved to a new position.AddAdd a brief excerpt summarizing the content of this page.Add another %(verbose_name)sAdd child pageAdd media files to categoryAdd new itemAdd selected media files to categoryAdd to categoryAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCancelCannot delete itemCannot delete item, because it is parent of at least one other item.Cannot overwrite with different file type (attempt to overwrite a %(old_ext)s with a %(new_ext)s)CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Copy content from the originalCreate translationDate-based publishingDescription of imageDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeExport selected media files as zip fileFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHistoryHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.OverwritePDF documentPage title for browser window. Same as title by default.ParentPost CommentPress the save button below to recover this version of the object.Press the save button below to revert to this version of the object.PreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %%(source_regions)s is moved to %%(target_region)s.Really change template?
    All changes are saved.Really delete item?Recover deleted %(verbose_name)sRegion emptyRelated pagesRemoveRevert %(verbose_name)sRich TextSaveSearch engine optimizationSelect category to apply:Select pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSuccessfully added %(count)d media file to %(category)s.Successfully added %(count)d media files to %(category)s.Successfully deleted %s items.Target URL for automatic redirects or the primary key of a page.TextThanks!The first line is the main title, the following lines are subtitles.The following media files will be added to the selected category:The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.This would create a loop in the hierarchyTitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You don't have the necessary permissions to edit this objectZIP file export failed: %sZIP file exported as %sZIP import failed: %sZip archiveactionsactivealternate textapplicationapplication contentapplication contentsavailable translationscaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesformatimageimagesin navigationinheritedis activelanguagelast updatedlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textssectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2013-02-16 00:00+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %(comment_username)s schrieb am %(comment_submit_date)s
    Nach %(filter_title)s %(comment_count)s Kommentare.%d Dateien importiert%s wurde an eine neue Position verschoben.HinzufügenKurze Zusammenfassung des Seiteninhaltes.Nochmals %(verbose_name)s hinzufügenUnterseite hinzufügenMediendateien zu Kategorie hinzufügenNeues Element hinzufügenAusgewählte zu Kategorie hinzufügenZu Kategorie hinzufügenNachherAlleDer angezeigte Inhalt wird durch den Inhalt der angegebenen Seite ersetzt.AudioVorherBinärdatenMassenupload mit ZIP Dateien:Zwischengespeicherte URLAbbrechenKann Element nicht löschenKann Element nicht löschen, weil es mindestens ein Unterelement hat.Kann nur gleiche Dateitypen ersetzen (versuchte ein %(old_ext)s mit einem %(new_ext)s zu überschreiben)Kategorie%s ändernTemplate ändernAlles zuklappenBestätigen, um das Element zu löschenInhalt wird von der übergeordneten Seite geerbt. Füge Inhalt hinzu, um dieses Verhalten zu ändernInhalt kompieren von OriginalÜbersetzung erstellenDatumsbasierte VeröffentlichungBeschreibung des BildesUnbekannter Verschiebe-Befehl.In der Seite bearbeitenÜbersetzungen bearbeitenAuszugAlles aufklappenAusgewählte Mediendateien als ZIP exportierenFeatureFilterFlashHTML TidyDie HTML-Validierung ergab %(count)d Warnungen. Bitte überprüfen Sie den aktualisierten Inhalt bevor Sie fortfahren: %(messages)sVersteckenVerlaufStartseiteHTML-Validierungswarnungen ignorierenBildNeu einfügen:Element erfolgreich gelöscht.Leer lassen wenn das Element immer aktiv bleiben soll.Dieses Feld für Einträge in der Primärsprache leer lassen.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigations-ErweiterungNeue Kommentare können hinzugefügt werdenKeine Kommentare.Keine Datei angegebenWeitere OptionenÜberschreibe die URL. Am Anfang und Ende muss ein / stehen, falls es sich um eine lokale URL handelt. Dieses Feld bestimmt die Navigation und die URLs von Unterseiten.ÜberschreibenPDF-DokumentSeitentitel für das Browser-Fenster. Standardmässig gleich wie der Titel.ÜbergeordnetKommentar abschickenDiese Version kann durch Drücken des Speichern-Knopfes wiederhergestellt werdenDiese Version kann durch Drücken des Speichern-Knopfes zurückgeholt werdenVorschauRSS FeedRSS FeedsTemplate wirklich ändern?
    Alle Änderungen werden gespeichert und Inhalt aus %(source_regions)s nach %(target_region)s verschoben.Template wirklich ändern?
    Alle Änderungen werden gespeichert.Element wirklich löschen?Gelöschtes Element %(verbose_name)s wiederherstellenRegion leerVerwandte SeitenEntfernenAlte Version von %(verbose_name)s wiederherstellenTextSichernSuchmaschinenoptimierungKategorie auswählen:Seiten auswählen, welche als ähnlicher Inhalt angezeigt werden sollen.Wähle das Modul aus, welches weitere Navigationspunkte erstellt.SendenSchnellzugriffeAnzeigenFertig bearbeitetSenden%(count)d Mediendatei zu %(category)s hinzugefügt.%(count)d Mediendateien zu %(category)s hinzugefügt.%s Elemente gelöscht.Ziel-URL oder Seiten-Id für automatische Weiterleitungen.TextDanke!Die erste Zeile ist der Haupttitel, die weiteren Zeilen UntertitelDie folgenden Mediendateien werden zur ausgewählten Kategorie hinzugefügt:Der RSS Feed wird mehrmals täglich aktualisiert. Eine Änderung des Titels erscheint erst nach der nächsten Feed-Aktualisierung auf der Webseite.Die URL wird schon von einer aktiven Seite verwendet.Die URL wird schon von einer anderen aktiven Seite verwendet.Dies wird auch für die generierte Navigation verwendet.Dies sollte ein Link zu einem Youtube- oder vimeo-Video sein, z.B.: http://www.youtube.com/watch?v=zmj1rpzDRZ0Diese Beschreibung wird vor der Standard-Beschreibung eingefügt.Diese Begriffe werden vor die Standard-Begriffsliste eingefügt.Dies würde eine Schleife in der Hierarchie erzeugenTitelVideoAuf der Webseite anzeigenWird automatisch gesetzt, wenn `veröffentlicht` aktiviert ist.Ungenügende Berechtigung um dieses Objekt zu bearbeitenZIP-Datei Export fehlgeschlagen: %sZIP-Datei exportiert als %sZIP-Import schlug fehl: %sZIP-ArchivAktionenAktivTextalternativeApplikationApplikationApplikationenVerfügbare ÜbersetzungenLegendeKategorienKategorieKommentareKontaktformularKontaktformulareInhaltInhaltstitelInhaltstypenCopyrightErstelltErstellt umDatenBeschreibungrunterbearbeitenE-MailaktiviertEinträgeEintragAuszugErweiterungenFeatureDateiDateiinfoDateigrösseDateitypDateienFormatBildBilderIm MenügeerbtAktivSpracheLetzte AktualisierungLinkMaximale AnzahlMediendateiMediendatei-ÜbersetzungMediendatei-ÜbersetzungenMediendateienMeta BeschreibungMeta BegriffeVerändert umNameNavigations-Erweiterungneunicht öffentlichSortierungÜberschriebene URLSeiteSeitentitelSeitenÜbergeordnetschlichtPositionVor-gerenderter InhaltveröffentlichtVeröffentlichen amVeröffentlicht bisveröffentlichtveröffentlicht amRoh-InhaltRoh-InhalteWeiterleiten zuentfernenTextTexteSektionSektionenSlugBetreffVerbundene SeiteTabelleTabellenBegriffeTemplateTemplateTemplatesTextTitelTitelzeileTitelzeile und -spalteÜbersetzung vonÜbersetzungenTypraufVideoVideo-LinkVideossichtbar von – bisfeincms-1.7.4/feincms/locale/de/LC_MESSAGES/django.po000066400000000000000000000631561212255543400220270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-02-16 00:00+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: models.py:369 content/template/models.py:59 msgid "template" msgstr "Template" #: models.py:509 msgid "ordering" msgstr "Sortierung" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:123 msgid "language" msgstr "Sprache" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Alle" #: admin/filterspecs.py:46 module/page/models.py:172 msgid "Parent" msgstr "Übergeordnet" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Kategorie" #: admin/item_editor.py:159 #, python-format msgid "Change %s" msgstr "%s ändern" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:170 #: module/page/models.py:226 msgid "title" msgstr "Titel" #: admin/tree_editor.py:402 #, python-format msgid "%s has been moved to a new position." msgstr "%s wurde an eine neue Position verschoben." #: admin/tree_editor.py:406 msgid "Did not understand moving instruction." msgstr "Unbekannter Verschiebe-Befehl." #: admin/tree_editor.py:415 msgid "actions" msgstr "Aktionen" #: admin/tree_editor.py:427 msgid "Successfully deleted %s items." msgstr "%s Elemente gelöscht." #: admin/tree_editor.py:435 #, fuzzy, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "%(verbose_name)s löschen" #: content/application/models.py:217 msgid "application content" msgstr "Applikation" #: content/application/models.py:218 msgid "application contents" msgstr "Applikationen" #: content/application/models.py:248 msgid "application" msgstr "Applikation" #: content/comments/models.py:24 msgid "enabled" msgstr "aktiviert" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Neue Kommentare können hinzugefügt werden" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "Kommentare" #: content/comments/models.py:49 msgid "public" msgstr "veröffentlicht" #: content/comments/models.py:49 msgid "not public" msgstr "nicht öffentlich" #: content/contactform/models.py:18 msgid "name" msgstr "Name" #: content/contactform/models.py:19 msgid "email" msgstr "E-Mail" #: content/contactform/models.py:20 msgid "subject" msgstr "Betreff" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "Inhalt" #: content/contactform/models.py:34 msgid "contact form" msgstr "Kontaktformular" #: content/contactform/models.py:35 msgid "contact forms" msgstr "Kontaktformulare" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "Datei" #: content/file/models.py:26 msgid "files" msgstr "Dateien" #: content/image/models.py:45 content/image/models.py:54 msgid "image" msgstr "Bild" #: content/image/models.py:48 msgid "alternate text" msgstr "Textalternative" #: content/image/models.py:49 msgid "Description of image" msgstr "Beschreibung des Bildes" #: content/image/models.py:50 module/medialibrary/models.py:231 msgid "caption" msgstr "Legende" #: content/image/models.py:55 msgid "images" msgstr "Bilder" #: content/image/models.py:80 msgid "position" msgstr "Position" #: content/image/models.py:88 msgid "format" msgstr "Format" #: content/medialibrary/models.py:49 content/section/models.py:36 #: module/medialibrary/fields.py:59 module/medialibrary/models.py:97 msgid "media file" msgstr "Mediendatei" #: content/medialibrary/models.py:50 module/medialibrary/models.py:98 msgid "media files" msgstr "Mediendateien" #: content/medialibrary/models.py:58 content/section/models.py:52 #: content/table/models.py:82 msgid "type" msgstr "Typ" #: content/raw/models.py:18 msgid "raw content" msgstr "Roh-Inhalt" #: content/raw/models.py:19 msgid "raw contents" msgstr "Roh-Inhalte" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "HTML-Validierungswarnungen ignorieren" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "Die HTML-Validierung ergab %(count)d Warnungen. Bitte überprüfen Sie den " "aktualisierten Inhalt bevor Sie fortfahren: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "Text" #: content/richtext/models.py:85 msgid "rich text" msgstr "Text" #: content/richtext/models.py:86 msgid "rich texts" msgstr "Texte" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "Der RSS Feed wird mehrmals täglich aktualisiert. Eine Änderung des Titels " "erscheint erst nach der nächsten Feed-Aktualisierung auf der Webseite." #: content/rss/models.py:22 msgid "link" msgstr "Link" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "Vor-gerenderter Inhalt" #: content/rss/models.py:24 msgid "last updated" msgstr "Letzte Aktualisierung" #: content/rss/models.py:25 msgid "max. items" msgstr "Maximale Anzahl" #: content/rss/models.py:29 msgid "RSS feed" msgstr "RSS Feed" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "RSS Feeds" #: content/section/models.py:41 msgid "section" msgstr "Sektion" #: content/section/models.py:42 msgid "sections" msgstr "Sektionen" #: content/table/models.py:63 msgid "plain" msgstr "schlicht" #: content/table/models.py:64 msgid "title row" msgstr "Titelzeile" #: content/table/models.py:66 msgid "title row and column" msgstr "Titelzeile und -spalte" #: content/table/models.py:72 msgid "table" msgstr "Tabelle" #: content/table/models.py:73 msgid "tables" msgstr "Tabellen" #: content/table/models.py:87 msgid "data" msgstr "Daten" #: content/template/models.py:51 msgid "template content" msgstr "Template" #: content/template/models.py:52 msgid "template contents" msgstr "Templates" #: content/video/models.py:25 msgid "video link" msgstr "Video-Link" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Dies sollte ein Link zu einem Youtube- oder vimeo-Video sein, z.B.: http://" "www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "Video" #: content/video/models.py:31 msgid "videos" msgstr "Videos" #: contrib/tagging.py:119 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "veröffentlicht" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Dies wird auch für die generierte Navigation verwendet." #: module/blog/models.py:33 msgid "published on" msgstr "veröffentlicht am" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "Wird automatisch gesetzt, wenn `veröffentlicht` aktiviert ist." #: module/blog/models.py:39 msgid "entry" msgstr "Eintrag" #: module/blog/models.py:40 msgid "entries" msgstr "Einträge" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "Begriffe" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:126 msgid "translation of" msgstr "Übersetzung von" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:129 msgid "Leave this empty for entries in the primary language." msgstr "Dieses Feld für Einträge in der Primärsprache leer lassen." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:46 msgid "available translations" msgstr "Verfügbare Übersetzungen" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "Erstellt um" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "Verändert um" #: module/extensions/ct_tracker.py:139 msgid "content types" msgstr "Inhaltstypen" #: module/extensions/datepublisher.py:69 msgid "publication date" msgstr "Veröffentlichen am" #: module/extensions/datepublisher.py:72 msgid "publication end date" msgstr "Veröffentlicht bis" #: module/extensions/datepublisher.py:74 msgid "Leave empty if the entry should stay active forever." msgstr "Leer lassen wenn das Element immer aktiv bleiben soll." #: module/extensions/datepublisher.py:105 msgid "visible from - to" msgstr "sichtbar von – bis" #: module/extensions/datepublisher.py:115 msgid "Date-based publishing" msgstr "Datumsbasierte Veröffentlichung" #: module/extensions/featured.py:11 msgid "featured" msgstr "Feature" #: module/extensions/featured.py:16 msgid "Featured" msgstr "Feature" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "Meta Begriffe" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Diese Begriffe werden vor die Standard-Begriffsliste eingefügt." #: module/extensions/seo.py:11 msgid "meta description" msgstr "Meta Beschreibung" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Diese Beschreibung wird vor der Standard-Beschreibung eingefügt." #: module/extensions/seo.py:17 msgid "Search engine optimization" msgstr "Suchmaschinenoptimierung" #: module/extensions/translations.py:201 msgid "Edit translation" msgstr "Übersetzungen bearbeiten" #: module/extensions/translations.py:204 msgid "Create translation" msgstr "Übersetzung erstellen" #: module/extensions/translations.py:209 module/extensions/translations.py:212 msgid "translations" msgstr "Übersetzungen" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "Dies würde eine Schleife in der Hierarchie erzeugen" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" "Kann nur gleiche Dateitypen ersetzen (versuchte ein %(old_ext)s mit einem " "%(new_ext)s zu überschreiben)" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "%(count)d Mediendatei zu %(category)s hinzugefügt." msgstr[1] "%(count)d Mediendateien zu %(category)s hinzugefügt." #: module/medialibrary/modeladmins.py:76 msgid "Add selected media files to category" msgstr "Ausgewählte zu Kategorie hinzufügen" #: module/medialibrary/modeladmins.py:85 #, python-format msgid "ZIP file exported as %s" msgstr "ZIP-Datei exportiert als %s" #: module/medialibrary/modeladmins.py:87 #, python-format msgid "ZIP file export failed: %s" msgstr "ZIP-Datei Export fehlgeschlagen: %s" #: module/medialibrary/modeladmins.py:92 msgid "Export selected media files as zip file" msgstr "Ausgewählte Mediendateien als ZIP exportieren" #: module/medialibrary/modeladmins.py:135 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Vorschau" #: module/medialibrary/modeladmins.py:140 module/medialibrary/models.py:88 msgid "file size" msgstr "Dateigrösse" #: module/medialibrary/modeladmins.py:145 module/medialibrary/models.py:86 msgid "created" msgstr "Erstellt" #: module/medialibrary/modeladmins.py:164 module/medialibrary/models.py:85 msgid "file type" msgstr "Dateityp" #: module/medialibrary/modeladmins.py:185 msgid "file info" msgstr "Dateiinfo" #: module/medialibrary/modeladmins.py:197 #, python-format msgid "%d files imported" msgstr "%d Dateien importiert" #: module/medialibrary/modeladmins.py:199 #, python-format msgid "ZIP import failed: %s" msgstr "ZIP-Import schlug fehl: %s" #: module/medialibrary/modeladmins.py:201 msgid "No input file given" msgstr "Keine Datei angegeben" #: module/medialibrary/models.py:43 msgid "parent" msgstr "Übergeordnet" #: module/medialibrary/models.py:45 module/page/models.py:171 msgid "slug" msgstr "Slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "Kategorie" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "Kategorien" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "Copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Bild" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Video" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Audio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "PDF-Dokument" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Text" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Text" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "ZIP-Archiv" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binärdaten" #: module/medialibrary/models.py:232 msgid "description" msgstr "Beschreibung" #: module/medialibrary/models.py:235 msgid "media file translation" msgstr "Mediendatei-Übersetzung" #: module/medialibrary/models.py:236 msgid "media file translations" msgstr "Mediendatei-Übersetzungen" #: module/page/forms.py:165 msgid "This URL is already taken by an active page." msgstr "Die URL wird schon von einer aktiven Seite verwendet." #: module/page/forms.py:183 msgid "This URL is already taken by another active page." msgstr "Die URL wird schon von einer anderen aktiven Seite verwendet." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Weitere Optionen" #: module/page/modeladmins.py:95 module/page/models.py:174 msgid "in navigation" msgstr "Im Menü" #: module/page/modeladmins.py:110 msgid "Add child page" msgstr "Unterseite hinzufügen" #: module/page/modeladmins.py:112 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Auf der Webseite anzeigen" #: module/page/modeladmins.py:131 #, python-format msgid "Add %(language)s Translation of \"%(page)s\"" msgstr "" #: module/page/modeladmins.py:161 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:175 msgid "You don't have the necessary permissions to edit this object" msgstr "Ungenügende Berechtigung um dieses Objekt zu bearbeiten" #: module/page/modeladmins.py:190 msgid "inherited" msgstr "geerbt" #: module/page/modeladmins.py:194 msgid "extensions" msgstr "Erweiterungen" #: module/page/modeladmins.py:198 module/page/models.py:206 msgid "is active" msgstr "Aktiv" #: module/page/models.py:167 msgid "active" msgstr "Aktiv" #: module/page/models.py:175 msgid "override URL" msgstr "Überschriebene URL" #: module/page/models.py:176 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Überschreibe die URL. Am Anfang und Ende muss ein / stehen, falls es sich um " "eine lokale URL handelt. Dieses Feld bestimmt die Navigation und die URLs " "von Unterseiten." #: module/page/models.py:177 msgid "redirect to" msgstr "Weiterleiten zu" #: module/page/models.py:178 msgid "Target URL for automatic redirects or the primary key of a page." msgstr "Ziel-URL oder Seiten-Id für automatische Weiterleitungen." #: module/page/models.py:180 msgid "Cached URL" msgstr "Zwischengespeicherte URL" #: module/page/models.py:393 msgid "page" msgstr "Seite" #: module/page/models.py:394 msgid "pages" msgstr "Seiten" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "Auszug" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "Kurze Zusammenfassung des Seiteninhaltes." #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Auszug" #: module/page/extensions/navigation.py:83 #: module/page/extensions/navigation.py:108 msgid "navigation extension" msgstr "Navigations-Erweiterung" #: module/page/extensions/navigation.py:111 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "Wähle das Modul aus, welches weitere Navigationspunkte erstellt." #: module/page/extensions/navigation.py:125 msgid "Navigation extension" msgstr "Navigations-Erweiterung" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Seiten auswählen, welche als ähnlicher Inhalt angezeigt werden sollen." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Verwandte Seiten" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "Verbundene Seite" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "" "Der angezeigte Inhalt wird durch den Inhalt der angegebenen Seite ersetzt." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "Inhaltstitel" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "Die erste Zeile ist der Haupttitel, die weiteren Zeilen Untertitel" #: module/page/extensions/titles.py:15 msgid "page title" msgstr "Seitentitel" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Seitentitel für das Browser-Fenster. Standardmässig gleich wie der Titel." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Titel" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr " Nach %(filter_title)s " #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Element wirklich löschen?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Bestätigen, um das Element zu löschen" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Element erfolgreich gelöscht." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Kann Element nicht löschen" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "Kann Element nicht löschen, weil es mindestens ein Unterelement hat." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Template ändern" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Template wirklich ändern?
    Alle Änderungen werden gespeichert." #: templates/admin/feincms/_messages_js.html:9 msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Template wirklich ändern?
    Alle Änderungen werden gespeichert und " "Inhalt aus %(source_regions)s nach " "%(target_region)s verschoben." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Verstecken" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Anzeigen" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Nachher" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Vorher" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Neu einfügen:" #: templates/admin/feincms/content_editor.html:15 msgid "Copy content from the original" msgstr "Inhalt kompieren von Original" #: templates/admin/feincms/content_editor.html:19 msgid "Region empty" msgstr "Region leer" #: templates/admin/feincms/content_editor.html:25 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Inhalt wird von der übergeordneten Seite geerbt. Füge Inhalt hinzu, um " "dieses Verhalten zu ändern" #: templates/admin/feincms/content_editor.html:33 msgid "Add new item" msgstr "Neues Element hinzufügen" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "Nochmals %(verbose_name)s hinzufügen" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "Entfernen" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Sichern" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Fertig bearbeitet" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "bearbeiten" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "neu" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "rauf" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "runter" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "entfernen" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Startseite" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "Gelöschtes Element %(verbose_name)s wiederherstellen" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" "Diese Version kann durch Drücken des Speichern-Knopfes wiederhergestellt " "werden" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "Verlauf" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "Alte Version von %(verbose_name)s wiederherstellen" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" "Diese Version kann durch Drücken des Speichern-Knopfes zurückgeholt werden" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Schnellzugriffe" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Alles zuklappen" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Alles aufklappen" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filter" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "In der Seite bearbeiten" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "Hinzufügen" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "Mediendateien zu Kategorie hinzufügen" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "Kategorie auswählen:" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" "Die folgenden Mediendateien werden zur ausgewählten Kategorie hinzugefügt:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "Zu Kategorie hinzufügen" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "Abbrechen" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Massenupload mit ZIP Dateien:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "Überschreiben" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Senden" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s Kommentare." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" "%(comment_username)s schrieb am %(comment_submit_date)s
    " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Keine Kommentare." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Kommentar abschicken" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Senden" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Danke!" #~ msgid "(no caption)" #~ msgstr "(Keine Legende)" #~ msgid "block" #~ msgstr "Block" #~ msgid "left" #~ msgstr "Links" #~ msgid "right" #~ msgstr "Rechts" #~ msgid "Search" #~ msgstr "Suche" #~ msgid "Symlinked page" #~ msgstr "Verbundene Seite" #~ msgid "rich text (ckeditor)" #~ msgstr "Text (ckeditor)" #~ msgid "rich texts (ckeditor)" #~ msgstr "Texte (ckeditor)" #~ msgid "You may edit the copied page below." #~ msgstr "Die kopierte Seite kann jetzt erneut bearbeitet werden." #~ msgid "" #~ "You have replaced %s. You may continue editing the now-active page below." #~ msgstr "" #~ "Sie haben %s ersetzt und können nun die aktive Seite weiterbearbeiten." #~ msgid "Move to" #~ msgstr "Verschieben nach" #~ msgid "Move" #~ msgstr "Verschieben nach" #~ msgid "Replace page %(to_replace)s" #~ msgstr "Seite %(to_replace)s ersetzen" #~ msgid "Create hidden copy of this page" #~ msgstr "Versteckte Kopie dieser Seite erstellen" feincms-1.7.4/feincms/locale/en/000077500000000000000000000000001212255543400164375ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/en/LC_MESSAGES/000077500000000000000000000000001212255543400202245ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/en/LC_MESSAGES/django.mo000066400000000000000000000005721212255543400220270ustar00rootroot00000000000000$,8@9Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2012-03-09 16:47+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feincms-1.7.4/feincms/locale/en/LC_MESSAGES/django.po000066400000000000000000000475251212255543400220430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "" #: models.py:551 msgid "ordering" msgstr "" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "" #: admin/tree_editor.py:417 msgid "actions" msgstr "" #: admin/tree_editor.py:429 #, python-format msgid "Successfully deleted %s items." msgstr "" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "" #: content/application/models.py:273 msgid "application contents" msgstr "" #: content/application/models.py:298 msgid "application" msgstr "" #: content/comments/models.py:24 msgid "enabled" msgstr "" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "" #: content/comments/models.py:49 msgid "public" msgstr "" #: content/comments/models.py:49 msgid "not public" msgstr "" #: content/contactform/models.py:18 msgid "name" msgstr "" #: content/contactform/models.py:19 msgid "email" msgstr "" #: content/contactform/models.py:20 msgid "subject" msgstr "" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "" #: content/contactform/models.py:34 msgid "contact form" msgstr "" #: content/contactform/models.py:35 msgid "contact forms" msgstr "" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "" #: content/file/models.py:26 msgid "files" msgstr "" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "" #: content/image/models.py:53 msgid "images" msgstr "" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "" #: content/medialibrary/models.py:139 msgid "block" msgstr "" #: content/medialibrary/models.py:140 msgid "left" msgstr "" #: content/medialibrary/models.py:141 msgid "right" msgstr "" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "" #: content/raw/models.py:18 msgid "raw content" msgstr "" #: content/raw/models.py:19 msgid "raw contents" msgstr "" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "" #: content/richtext/models.py:85 msgid "rich text" msgstr "" #: content/richtext/models.py:86 msgid "rich texts" msgstr "" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" #: content/rss/models.py:22 msgid "link" msgstr "" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "" #: content/rss/models.py:24 msgid "last updated" msgstr "" #: content/rss/models.py:25 msgid "max. items" msgstr "" #: content/rss/models.py:29 msgid "RSS feed" msgstr "" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "" #: content/section/models.py:41 msgid "section" msgstr "" #: content/section/models.py:42 msgid "sections" msgstr "" #: content/table/models.py:66 msgid "plain" msgstr "" #: content/table/models.py:67 msgid "title row" msgstr "" #: content/table/models.py:69 msgid "title row and column" msgstr "" #: content/table/models.py:75 msgid "table" msgstr "" #: content/table/models.py:76 msgid "tables" msgstr "" #: content/table/models.py:90 msgid "data" msgstr "" #: content/template/models.py:51 msgid "template content" msgstr "" #: content/template/models.py:52 msgid "template contents" msgstr "" #: content/video/models.py:25 msgid "video link" msgstr "" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" #: content/video/models.py:30 msgid "video" msgstr "" #: content/video/models.py:31 msgid "videos" msgstr "" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "" #: module/blog/models.py:33 msgid "published on" msgstr "" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" #: module/blog/models.py:39 msgid "entry" msgstr "" #: module/blog/models.py:40 msgid "entries" msgstr "" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "" #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "" #: module/extensions/featured.py:9 msgid "featured" msgstr "" #: module/extensions/featured.py:14 msgid "Featured" msgstr "" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "" #: module/extensions/seo.py:11 msgid "meta description" msgstr "" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "" #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "" #: module/extensions/translations.py:200 msgid "translations" msgstr "" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "" #: module/medialibrary/models.py:49 msgid "category" msgstr "" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "" #: module/medialibrary/models.py:202 msgid "Image" msgstr "" #: module/medialibrary/models.py:203 msgid "Video" msgstr "" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "" #: module/medialibrary/models.py:207 msgid "Text" msgstr "" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "" #: module/medialibrary/models.py:236 msgid "description" msgstr "" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "" #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "" #: module/page/modeladmins.py:41 msgid "Other options" msgstr "" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "" #: module/page/models.py:138 msgid "active" msgstr "" #: module/page/models.py:146 msgid "override URL" msgstr "" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" #: module/page/models.py:148 msgid "redirect to" msgstr "" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "" #: module/page/models.py:150 msgid "Cached URL" msgstr "" #: module/page/models.py:161 msgid "page" msgstr "" #: module/page/models.py:162 msgid "pages" msgstr "" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "" #: module/page/extensions/titles.py:13 msgid "content title" msgstr "" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" #: module/page/extensions/titles.py:15 msgid "page title" msgstr "" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "" #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "" #: templates/admin/feincms/_messages_js.html:9 #, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "" #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" #: templates/content/comments/default.html:28 msgid "No comments." msgstr "" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "" feincms-1.7.4/feincms/locale/es/000077500000000000000000000000001212255543400164445ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/es/LC_MESSAGES/000077500000000000000000000000001212255543400202315ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/es/LC_MESSAGES/django.mo000066400000000000000000000373761212255543400220500ustar00rootroot00000000000000$3,`Zp$ 9+: V$c1  D%aj  f{'& & .':bkr xt# - 3?4Z5 (5 IW  8 F MBZD 4   $ <FKRm6[ ). 3@rG# TDgA,t1.c 2f 3 )   !G!<Y!!!! !!!! "")">"U"[" c"n"w" " "" " " "" "" """"#### #)#2# 7# A# K#U#[#b#h# o# }# ## ### # ### #$ $!$3$8$M$ Q$\$ e$r$ w$$$$$$$$$ $ $ $ % %% #% -%8%>%F%O%T%\%k%q%x%}%%%%% %%% %%%% %&&o!&O'''('-( U(c(Dk(((*()<*)g))).))))2) **!*K=*w* + ++.+"A+xd+++5 ,B,"\,,,,,@, --- -'----&-...A7.;y.....%/)/#9/]/l/ 0 0]-000L0M0A1S1 \1f1D2([2/22222 233'3#>3Eb3h3444'4-4?4F4#4 5/5J5 P5S[5L5M5J6.607CC7j7973,8'`888 8A8=8*%9P9*n9 9999 999 :$:+: 3: ?: J:V:m: ::: : ::: ::::; ;;; '; 3;@;H;a;t;;;; ;;;;;; ;;;<!<";<^<q<<<<<<<< <<<=== #=-=G=P=f= u= ===== = === ===>>> %> />9>P>h>n>v>>> >>>>>>>RKped@6C9&k=fn~u%*\3H.A]Z"Nb[_`74y;PG>^a{8i jFo|SILtcv0XEl$ Jsq:/-T,!BMm1+Y'OVxh)<Q wzWU}D(2#g r 5? %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%d files imported%s has been moved to a new position.(no caption)AddAdd a brief excerpt summarizing the content of this page.Add another %(verbose_name)sAdd child pageAdd media files to categoryAdd new itemAdd selected media files to categoryAdd to categoryAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCancelCannot delete itemCannot delete item, because it is parent of at least one other item.Cannot overwrite with different file type (attempt to overwrite a %(old_ext)s with a %(new_ext)s)CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create translationDate-based publishingDelete selected %(verbose_name_plural)sDescription of imageDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeExport selected media files as zip fileFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHistoryHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.OverwritePDF documentPage title for browser window. Same as title by default.ParentPost CommentPress the save button below to recover this version of the object.Press the save button below to revert to this version of the object.PreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %%(source_regions)s is moved to %%(target_region)s.Really change template?
    All changes are saved.Really delete item?Recover deleted %(verbose_name)sRegion emptyRelated pagesRemoveRevert %(verbose_name)sRich TextSaveSearchSearch engine optimizationSelect category to apply:Select pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowSiteStop EditingSubmitSuccessfully added %(count)d media file to %(category)s.Successfully added %(count)d media files to %(category)s.Successfully deleted %s items.TaggingTarget URL for automatic redirects.TextThanks!The content from the original translation has been copied to the newly created page.The first line is the main title, the following lines are subtitles.The following media files will be added to the selected category:The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.This would create a loop in the hierarchyTitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You don't have the necessary permissions to edit this objectZIP file export failed: %sZIP file exported as %sZIP import failed: %sZip archiveactionsactivealternate textapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesformatimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textsrightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FeinCMS Report-Msgid-Bugs-To: POT-Creation-Date: 2012-08-16 18:17+0200 PO-Revision-Date: 2013-01-21 14:56+0200 Last-Translator: Matthias Kestenholz Language-Team: LANGUAGE Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1) %(comment_username)s dijo el %(comment_submit_date)s
    Por %(filter_title)s%(comment_count)s comentarios.importados %d archivos%s ha sido movido a una nueva posición(sin leyenda)AñadirAñade una breve descripción resumiendo el contenido de la página.Añadir otro/a %(verbose_name)sAñade una página hijaAñadir archivos de medios a la categoríaAñadir nuevo elementoAñadir los archivos de medios seleccionados a la categoríaAñadir a la categoríaDespuésTodosTodo el contenido es heredado de esta página.AudioAntesBinarioSubir varias archivos de medios en un archivo ZIP:URL en cachéCancelarImposible de eliminar el elementoImposible eliminar el elemento, porque es padre de al menos otro elemento .No se puede sobreescribir con un tipo de archivo diferente (intento de sobreescribir un %(old_ext)s con un %(new_ext)s)CategoríaModificar %sCambiar la plantillaColapsar el árbolConfirme para eliminar el elementoEl contenido del sitio padre se hereda automáticamente. Para sobreescribir este comportamiento añade algún contenido.Crear traducciónPublicación según la fechaEliminar los/as %(verbose_name_plural)s seleccionadosDescripción de la imagenNo entiendo la orden de movimientoEditar en el sitioEditar traducciónExtractoExpandir el árbolExportar los archivos de medios selccionados como un archivo ZIPCategorizadoFiltrarFlashHTML TidyLa validación del HTML produjo %(count)d avisos. Por favor revisa el contenido actualizado de la parte inferior antes de continuar: %(messages)sOcultarHistoriaPágina inicialIgnorar los avisos de validación HTMLImagenInsertar nuevo:Elemento eliminado con éxito.Si se deja en blanco la entrada permanecerá activa para siempre.Deja este campo vacío para las entradas en el idioma base.Microsoft ExcelMicrosoft PowerPointMicrosoft WordExtensión de navegaciónSe podrán añadir nuevos comentariosSin comentariosNo se indicó un archivo de entradaOtras opcionesURL efectivo. Debe contener una '/' al principio y al final al cuando se trata de un URL local. Este campo afecta a la navegación y a los URLs de las sub-páginas.Sobreescribirdocumento PDFTítulo de la página para la ventana del navegador. Si se omite utilizará el mismo título.PadreEnvía un comentarioPulse el botón de guardar inferior para recuperar esta versión del objeto.Pulse el botón de guardar inferior para revertir a esta versión del objeto.Previsualizaciónfeed RSSfeeds RSS¿Deseas cambiar la plantilla?
    Todos los cambios se guardarán y el contenido desde %%(source_regions)s se moverá a %%(target_region)s.¿Deseas cambiar la plantilla?
    Todos los cambios se guardarán.¿Confirma la eliminación del elemento?Recuperar los/as %(verbose_name)s eliminados/asRegión vacíaPáginas relacionadasEliminarRevertir %(verbose_name)sTexto ricoGuardarBuscarOptimización para motores de búsquedaSeleccionar categoría que aplicar:Seleccione las páginas que se mostrarán como contenido relacionado.Seleccione el módulo que provee sub-páginas para esta pagina si necesitas personalizar la navegación.EnviarAtajosMostrarSitioTerminar ediciónEnviarSe añadió con éxito %(count)d archivo de medios a la categoría %(category)s.Se añadieron con éxito %(count)d archivos de medios a la categoría %(category)s.%s elementos eliminados con éxito.EtiquetadoURL de destino para redirecciones automáticas.Texto¡Gracias!El contenido de la traducción original se ha copiado en la página recién creada.La primera línea es el título principal. Otras líneas serán subtítulos.Los siguientes archivos de medios se añadirán a la categoría seleccionada:El feed RSS es actualizado varias veces por dia. Cambios en el título solo aparecen en la página después de la actualización del feed RSS siguiente.Esta URL ya está en uso en una página activaEsta URL ya está en uso por otra página activaTambién será usado para la navegación generada automáticamente.Debe ser un enlace a un vídeo de YouTube o Vimeo. Por ejemplo: http://www.youtube.com/watch?v=zmj1rpzDRZ0Será incluido antes de la meta descripción por defecto.Será incluido antes de la lista de palabras clave.Esto crearía un bucle en la jerarquíaTítulosVídeoVer en sitioSe establecerá automáticamente cuando se marque en 'publicado'.No dispone de los permisos necesarios para editar este objetoLa exportación del archivo ZIP falló: %sArchivo ZIP exportado como %sLa importación del archivo ZIP falló: %sArchivo ZIPaccionesactivotext alternativoaplicacióncontenido de la aplicacióncontenidos de la aplicacióntraducciones disponiblesbloqueleyendacategoríascategoríacomentariosformulario de contactoformularios de contactocontenidotítulo del contenidotipos de contenidocopyrightcreado enfecha de creacióndatosdescripciónabajoeditare-mailactivoentradasentradaextractoextensionescategorizadoarchivoinformación del archivotamaño de archivotipo de archivoarchivosformatoimagenimágenesen la navegaciónheredadoactivoidiomaúltima actualizaciónizquierdaenlacenúmero máximoarchivo de mediostraducción del archivo de mediostraducciones del archivo de mediosarchivos de mediosmeta descripciónmeta palabras clavefecha de modificaciónnombreextensión de navegaciónnuevoprivadoordenURL efectivopáginatítulo de la páginapáginaspadreplanoposicióncontenido pre-renderizadopúblicofecha de publicaciónpublicar hastapublicadopublicado encontenido crudocontenidos crudosredirección aborrartexto ricotextos ricosderechasecciónseccionesslugasuntopágina direccionadatablatablasetiquetasplantillaplantilla de contenidoplantilla de contenidostextotítulotítulo de la filatítulo de fila y columnatraducción detraduccionestipoarribavídeoenlace de vídeovídeosvisible de - hastafeincms-1.7.4/feincms/locale/es/LC_MESSAGES/django.po000066400000000000000000000633031212255543400220400ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Maarten van Gompel (proycon) , 2009. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2013-01-21 14:56+0200\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: LANGUAGE \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "plantilla" #: models.py:551 msgid "ordering" msgstr "orden" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "idioma" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Todos" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Padre" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Categoría" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Modificar %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "título" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s ha sido movido a una nueva posición" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "No entiendo la orden de movimiento" #: admin/tree_editor.py:417 msgid "actions" msgstr "acciones" #: admin/tree_editor.py:429 #, python-format msgid "Successfully deleted %s items." msgstr "%s elementos eliminados con éxito." #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "Eliminar los/as %(verbose_name_plural)s seleccionados" #: content/application/models.py:272 msgid "application content" msgstr "contenido de la aplicación" #: content/application/models.py:273 msgid "application contents" msgstr "contenidos de la aplicación" #: content/application/models.py:298 msgid "application" msgstr "aplicación" #: content/comments/models.py:24 msgid "enabled" msgstr "activo" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Se podrán añadir nuevos comentarios" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "comentarios" #: content/comments/models.py:49 msgid "public" msgstr "público" #: content/comments/models.py:49 msgid "not public" msgstr "privado" #: content/contactform/models.py:18 msgid "name" msgstr "nombre" #: content/contactform/models.py:19 msgid "email" msgstr "e-mail" #: content/contactform/models.py:20 msgid "subject" msgstr "asunto" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "contenido" #: content/contactform/models.py:34 msgid "contact form" msgstr "formulario de contacto" #: content/contactform/models.py:35 msgid "contact forms" msgstr "formularios de contacto" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "archivo" #: content/file/models.py:26 msgid "files" msgstr "archivos" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "imagen" #: content/image/models.py:46 msgid "alternate text" msgstr "text alternativo" #: content/image/models.py:47 msgid "Description of image" msgstr "Descripción de la imagen" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "leyenda" #: content/image/models.py:53 msgid "images" msgstr "imágenes" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "posición" #: content/image/models.py:87 msgid "format" msgstr "formato" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(sin leyenda)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "archivo de medios" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "archivos de medios" #: content/medialibrary/models.py:139 msgid "block" msgstr "bloque" #: content/medialibrary/models.py:140 msgid "left" msgstr "izquierda" #: content/medialibrary/models.py:141 msgid "right" msgstr "derecha" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "tipo" #: content/raw/models.py:18 msgid "raw content" msgstr "contenido crudo" #: content/raw/models.py:19 msgid "raw contents" msgstr "contenidos crudos" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Ignorar los avisos de validación HTML" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "La validación del HTML produjo %(count)d avisos. Por favor revisa el " "contenido actualizado de la parte inferior antes de continuar: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "texto" #: content/richtext/models.py:85 msgid "rich text" msgstr "texto rico" #: content/richtext/models.py:86 msgid "rich texts" msgstr "textos ricos" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "El feed RSS es actualizado varias veces por dia. Cambios en el título solo " "aparecen en la página después de la actualización del feed RSS siguiente." #: content/rss/models.py:22 msgid "link" msgstr "enlace" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "contenido pre-renderizado" #: content/rss/models.py:24 msgid "last updated" msgstr "última actualización" #: content/rss/models.py:25 msgid "max. items" msgstr "número máximo" #: content/rss/models.py:29 msgid "RSS feed" msgstr "feed RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "feeds RSS" #: content/section/models.py:41 msgid "section" msgstr "sección" #: content/section/models.py:42 msgid "sections" msgstr "secciones" #: content/table/models.py:66 msgid "plain" msgstr "plano" #: content/table/models.py:67 msgid "title row" msgstr "título de la fila" #: content/table/models.py:69 msgid "title row and column" msgstr "título de fila y columna" #: content/table/models.py:75 msgid "table" msgstr "tabla" #: content/table/models.py:76 msgid "tables" msgstr "tablas" #: content/table/models.py:90 msgid "data" msgstr "datos" #: content/template/models.py:51 msgid "template content" msgstr "plantilla de contenido" #: content/template/models.py:52 msgid "template contents" msgstr "plantilla de contenidos" #: content/video/models.py:25 msgid "video link" msgstr "enlace de vídeo" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Debe ser un enlace a un vídeo de YouTube o Vimeo. Por ejemplo: http://www." "youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "vídeo" #: content/video/models.py:31 msgid "videos" msgstr "vídeos" #: contrib/tagging.py:117 msgid "Tagging" msgstr "Etiquetado" #: module/blog/models.py:28 msgid "published" msgstr "publicado" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "También será usado para la navegación generada automáticamente." #: module/blog/models.py:33 msgid "published on" msgstr "publicado en" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "Se establecerá automáticamente cuando se marque en 'publicado'." #: module/blog/models.py:39 msgid "entry" msgstr "entrada" #: module/blog/models.py:40 msgid "entries" msgstr "entradas" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "etiquetas" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "traducción de" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Deja este campo vacío para las entradas en el idioma base." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "traducciones disponibles" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "fecha de creación" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "fecha de modificación" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "tipos de contenido" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "fecha de publicación" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "publicar hasta" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Si se deja en blanco la entrada permanecerá activa para siempre." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "visible de - hasta" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Publicación según la fecha" #: module/extensions/featured.py:9 msgid "featured" msgstr "categorizado" #: module/extensions/featured.py:14 msgid "Featured" msgstr "Categorizado" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta palabras clave" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Será incluido antes de la lista de palabras clave." #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta descripción" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Será incluido antes de la meta descripción por defecto." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Optimización para motores de búsqueda" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Editar traducción" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Crear traducción" #: module/extensions/translations.py:200 msgid "translations" msgstr "traducciones" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "Esto crearía un bucle en la jerarquía" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" "No se puede sobreescribir con un tipo de archivo diferente (intento " "de sobreescribir un %(old_ext)s con un %(new_ext)s)" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" "Se añadió con éxito %(count)d archivo de medios a la categoría " "%(category)s." msgstr[1] "" "Se añadieron con éxito %(count)d archivos de medios a la categoría " "%(category)s." #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "Añadir los archivos de medios seleccionados a la categoría" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "Archivo ZIP exportado como %s" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "La exportación del archivo ZIP falló: %s" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "Exportar los archivos de medios selccionados como un archivo ZIP" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Previsualización" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "tamaño de archivo" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "creado en" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "tipo de archivo" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "información del archivo" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "importados %d archivos" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "La importación del archivo ZIP falló: %s" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "No se indicó un archivo de entrada" #: module/medialibrary/models.py:43 msgid "parent" msgstr "padre" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "categoría" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "categorías" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Imagen" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Vídeo" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Audio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "documento PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Texto" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Texto rico" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "Archivo ZIP" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binario" #: module/medialibrary/models.py:236 msgid "description" msgstr "descripción" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "traducción del archivo de medios" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "traducciones del archivo de medios" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Esta URL ya está en uso en una página activa" #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Esta URL ya está en uso por otra página activa" #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Otras opciones" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "en la navegación" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Añade una página hija" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Ver en sitio" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" "El contenido de la traducción original se ha copiado en la página " "recién creada." #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "No dispone de los permisos necesarios para editar este objeto" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "heredado" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "extensiones" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "activo" #: module/page/models.py:138 msgid "active" msgstr "activo" #: module/page/models.py:146 msgid "override URL" msgstr "URL efectivo" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "URL efectivo. Debe contener una '/' al principio y al final al cuando se trata " "de un URL local. Este campo afecta a la navegación y a los URLs de las sub-páginas." #: module/page/models.py:148 msgid "redirect to" msgstr "redirección a" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL de destino para redirecciones automáticas." #: module/page/models.py:150 msgid "Cached URL" msgstr "URL en caché" #: module/page/models.py:161 msgid "page" msgstr "página" #: module/page/models.py:162 msgid "pages" msgstr "páginas" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "extracto" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "Añade una breve descripción resumiendo el contenido de la página." #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Extracto" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "extensión de navegación" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Seleccione el módulo que provee sub-páginas para esta pagina si necesitas " "personalizar la navegación." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "Extensión de navegación" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Seleccione las páginas que se mostrarán como contenido relacionado." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Páginas relacionadas" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "Sitio" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "página direccionada" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Todo el contenido es heredado de esta página." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "título del contenido" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" "La primera línea es el título principal. Otras líneas serán subtítulos." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "título de la página" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Título de la página para la ventana del navegador. Si se omite utilizará el " "mismo título." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Títulos" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr " Por %(filter_title)s" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Buscar" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "¿Confirma la eliminación del elemento?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Confirme para eliminar el elemento" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Elemento eliminado con éxito." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Imposible de eliminar el elemento" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Imposible eliminar el elemento, porque es padre de al menos otro elemento ." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Cambiar la plantilla" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "¿Deseas cambiar la plantilla?
    Todos los cambios se guardarán." #: templates/admin/feincms/_messages_js.html:9 #, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "¿Deseas cambiar la plantilla?
    Todos los cambios se guardarán y el " "contenido desde %%(source_regions)s se moverá a " "%%(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Ocultar" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Mostrar" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Después" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Antes" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Insertar nuevo:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Región vacía" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "El contenido del sitio padre se hereda automáticamente. Para sobreescribir " "este comportamiento añade algún contenido." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Añadir nuevo elemento" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "Añadir otro/a %(verbose_name)s" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "Eliminar" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Guardar" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Terminar edición" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "editar" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nuevo" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "arriba" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "abajo" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "borrar" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Página inicial" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "Recuperar los/as %(verbose_name)s eliminados/as" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "Pulse el botón de guardar inferior para recuperar esta versión del objeto." #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "Historia" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "Revertir %(verbose_name)s" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "Pulse el botón de guardar inferior para revertir a esta versión del objeto." #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Atajos" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Colapsar el árbol" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Expandir el árbol" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtrar" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Editar en el sitio" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "Añadir" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "Añadir archivos de medios a la categoría" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "Seleccionar categoría que aplicar:" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "Los siguientes archivos de medios se añadirán a la categoría seleccionada:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "Añadir a la categoría" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "Cancelar" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Subir varias archivos de medios en un archivo ZIP:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "Sobreescribir" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Enviar" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s comentarios." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s dijo el %(comment_submit_date)s
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Sin comentarios" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Envía un comentario" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Enviar" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "¡Gracias!" #~ msgid "Symlinked page" #~ msgstr "Página enlazada" feincms-1.7.4/feincms/locale/fr/000077500000000000000000000000001212255543400164445ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/fr/LC_MESSAGES/000077500000000000000000000000001212255543400202315ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/fr/LC_MESSAGES/django.mo000066400000000000000000000305411212255543400220330ustar00rootroot00000000000000    1# *5DH%9  f,   )4D:y  8@# +6 ?I4 +8?[`u7[ *4#;_d0l`DC,1.(cW23"; UGbxI#m# '- 5@ I Vd l z         &1 :GL Q \g~    $*3HY n x       / >KPS Ydkd} ->6Cz'%]68 Uo   # p!&!!! !!!!"""*"0"F"'U";}"H"#( #I#L#[# $M!$o$Bv$$ $$$$S%!% & )&!3& U&!a&*& &K&m' r'}'"'''='v'Uj((/^)4)3)r).j*6*0*++P,+}+T ,+u,,,,,,- --+-B-Z-_- h- t------ ---- . ..!.*.3. ;.F.N.U.e.n.t.{.... ..... ."/#/6/ G/S/h/l// //////////%0-0 50 @0 L0 Z0 g0q0w0~000 0000 000000 1 1!1 &131:1I1Q1ABZR`w:I?jS\lW/P 7d,oDG%KL^[eh9H4~(@)2+{*=yq-tur VOJi$f UYz_Es6<]NvaM#1&8n Tp!C xQcm}bX3|"g5'F ;.>k0 By %(filter_title)s (no caption)Add %(name)sAdd child pageAdd new itemAllAll content is inherited from this page if given.BinaryCached URLCannot delete itemCannot delete item, because it is parent of at least one other item.Cannot make a node a child of itself.Cannot remove this frame while inside this admin section.Change %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create hidden copy of this pageCreate translationCutDeleteEditEdit translationExpand treeFilterFlashHomeImageInsert as childInsert beforeItem deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language (%s).Move selected item toNo item has been selected.OKOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.ParentPlease correct the error below.Please correct the errors below.PreviewPropertiesRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyReloadReplace page %(to_replace)sSaveSave and add anotherSave and continue editingSearchSelect an item on the left side if you want to edit it.Select the module providing subpages for this page if you need to customize the navigation.ShortcutsSubmitTarget URL for automatic redirects.TextThanks!The %(name)s "%(obj)s" was changed successfully.The context menu on the tree root and tree nodes provide you with additional modes of operation.The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.Tree saved successfully.Video from unknown portalView on siteWill be set automatically once you tick the `published` checkbox above.You can change the structure of the tree by drag-dropping elements. Please note that changes will be saved immediately. You have replaced %s. You may continue editing the now-active page below.You may add another %s below.You may edit it again below.You may edit the copied page below.actionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailentriesentryextensionsfilefile sizefile typefilesimageimagesin navigationinheritedis visiblelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionneworderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textsrightsectionsectionsslugsubjecttabletablestagstemplatetexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2009-10-17 12:36+0200 PO-Revision-Date: 2009-10-17 22:00 Last-Translator: Matthias Kestenholz Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Translated-Using: django-rosetta 0.4.7 Par %(filter_title)s (aucune légende)Ajout %(name)sAjouter page enfantAjouter un autreTousTout le contenu est hérité de cette page si donnée.Données binairesadresse URL temporairement enregistréeImpossible de supprimer cet élémentImpossible de supprimer l'élément, parce qu'il est le parent d'au moins un autre élément.Impossible de faire un noeud d'un enfant de lui-même.Impossible de supprimer ce cadre tandis qu'à l'intérieur du présent article admin.Changement %sChanger modèleRéduire l'arbreAffirmer pour supprimer l'élémentContenu du site parent est automatiquement hérité. Pour contourner ce comportement, ajoutez un peu de contenu.Créer une copie cachée de cette pageCréer traductionCouperSupprimerModifierModifier la traductionDévelopper l'arborescenceFiltreFlashPage d'accueilimageInsérer comme enfantInsérer avantL'objet a été supprimé avec succès.Laissez vide si l'entrée doit rester active pour toujours.Laissez cette case vide pour les entrées dans la langue primaire (% s).Déplacer l'élément choisieAucun élément n'a été sélectionné.OKAutres optionsOutrepasser l'URL cible. N'oubliez pas d'inclure des barres obliques au début et à la fin s'il s'agit d'une URL locale. Cela affecte la navigation et les adresses URL des sous-pages.Document PDFTitre de la page pour fenêtre de navigateur. Même que le titre par défaut.ParentSVP corrigez l'erreur ci-aprèsSVP corrigez les erreurs ci-aprèsPrévisualiserPropriétésFil RSSFils RSSRéellement changer de modèle?
    Toutes les modifications sont enregistrées et le contenu de %(source_regions)s est déplacé vers %(target_region)s.Réellement changer de modèle?
    Toutes les modifications sont enregistrées.Vraiment supprimer cet élément?Région videRechargerRemplacer la page %(to_replace)s EnregistrerEnregistrer et ajouter un nouveauEnregistrer et continuer les modificationsRechercheSélectionnez un élément sur le côté gauche si vous voulez le modifier.Sélectionnez le module fournissant pages pour cette page si vous avez besoin de personnaliser la navigation.RaccourcisEnvoyerURL pour redirections automatiquestexteMerci!L'objet %(name)s « %(obj)s » a été modifié avec succès.Le menu contextuel sur la racine d'arbre et de nœuds de l'arborescence vous fournir d'autres modes de fonctionnement.La première ligne est le titre principal, les lignes suivantes sont des sous-titres.Le champ rss est mis à jour plusieurs fois par jour. Un changement dans le titre ne sera visible que sur la page d'accueil après la mise à jour prochaine.Cette URL est déjà prise par une page active.Cette URL est déjà pris par une autre page active.Il est utilisé pour la navigation généré aussi.Cela devrait être un lien vers une vidéo YouTube ou Vimeo, à savoir: http://www.youtube.com/watch?v=zmj1rpzDRZ0Ce sera ajouté à la description par défaut.Ce sera ajouté à la liste de mots clés par défaut.Structure arborescente enregistré avec succès.Vidéo de portail inconnuVoir sur le siteSera mis automatiquement une fois que vous cochez la case «publié» ci-dessus.Vous pouvez changer la structure de l'arbre par glisser-déposer les éléments. S'il vous plaît noter que les modifications seront enregistrées immédiatement.Vous avez remplacé% s. Vous pouvez continuer à modifier le page active ci-dessous.Vous pouvez ajouter un autre %s ci-dessous.Vous pouvez continuer l'édition ci-dessous.Vous pouvez continuer l'édition ci-dessous.actionsactifapplicationcontenu d'applicationcontenus d'applicationtraductions disponiblesbloclégendecatégoriescatégorieformulaire de contactformulaires de contactContenutitre du contenutypes de contenucopyrightcréedate de créationdonnéesdescriptionvers le bastraitercourrielentréesentréeextensionsfichiertailletype de fichierfichiersimageimagesà la navigationhéritévisiblelanguemise à jourgauchelienmax. élémentsfichier de médiatraductions du fichier de médiatraductions des fichiers de médiafichiers de médiadescription metatermes metadate de modificationnomadditif de la navigationnouveauséquenceadresse URL forcéepagetitre de la pagepagesparentplainepositioncontenu générédate de la publicationdate de termination de la publicationpubliépublié lecontenu crucontenus crusrediriger àsupprimertextetextesdroitesectionsectionstélougousujettableautableauxmots-clémodèletextetitretitre de la ligneligne de titre et de la colonnetraduction detraductionstypevers le hautvidéolien du vidéovidéosvisible de - àfeincms-1.7.4/feincms/locale/fr/LC_MESSAGES/django.po000066400000000000000000000562331212255543400220440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: LANGUAGE \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "modèle" #: models.py:551 msgid "ordering" msgstr "séquence" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "langue" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Tous" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Parent" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Changement %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "titre" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "" #: admin/tree_editor.py:417 msgid "actions" msgstr "actions" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Vraiment supprimer cet élément?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "contenu d'application" #: content/application/models.py:273 msgid "application contents" msgstr "contenus d'application" #: content/application/models.py:298 msgid "application" msgstr "application" #: content/comments/models.py:24 msgid "enabled" msgstr "" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "" #: content/comments/models.py:49 msgid "public" msgstr "" #: content/comments/models.py:49 msgid "not public" msgstr "" #: content/contactform/models.py:18 msgid "name" msgstr "nom" #: content/contactform/models.py:19 msgid "email" msgstr "courriel" #: content/contactform/models.py:20 msgid "subject" msgstr "sujet" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "Contenu" #: content/contactform/models.py:34 msgid "contact form" msgstr "formulaire de contact" #: content/contactform/models.py:35 msgid "contact forms" msgstr "formulaires de contact" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "fichier" #: content/file/models.py:26 msgid "files" msgstr "fichiers" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "image" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "légende" #: content/image/models.py:53 msgid "images" msgstr "images" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "position" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(aucune légende)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "fichier de média" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "fichiers de média" #: content/medialibrary/models.py:139 msgid "block" msgstr "bloc" #: content/medialibrary/models.py:140 msgid "left" msgstr "gauche" #: content/medialibrary/models.py:141 msgid "right" msgstr "droite" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "type" #: content/raw/models.py:18 msgid "raw content" msgstr "contenu cru" #: content/raw/models.py:19 msgid "raw contents" msgstr "contenus crus" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "texte" #: content/richtext/models.py:85 msgid "rich text" msgstr "texte" #: content/richtext/models.py:86 msgid "rich texts" msgstr "textes" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "Le champ rss est mis à jour plusieurs fois par jour. Un changement dans le " "titre ne sera visible que sur la page d'accueil après la mise à jour " "prochaine." #: content/rss/models.py:22 msgid "link" msgstr "lien" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "contenu généré" #: content/rss/models.py:24 msgid "last updated" msgstr "mise à jour" #: content/rss/models.py:25 msgid "max. items" msgstr "max. éléments" #: content/rss/models.py:29 msgid "RSS feed" msgstr "Fil RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "Fils RSS" #: content/section/models.py:41 msgid "section" msgstr "section" #: content/section/models.py:42 msgid "sections" msgstr "sections" #: content/table/models.py:66 msgid "plain" msgstr "plaine" #: content/table/models.py:67 msgid "title row" msgstr "titre de la ligne" #: content/table/models.py:69 msgid "title row and column" msgstr "ligne de titre et de la colonne" #: content/table/models.py:75 msgid "table" msgstr "tableau" #: content/table/models.py:76 msgid "tables" msgstr "tableaux" #: content/table/models.py:90 msgid "data" msgstr "données" #: content/template/models.py:51 msgid "template content" msgstr "" #: content/template/models.py:52 msgid "template contents" msgstr "" #: content/video/models.py:25 msgid "video link" msgstr "lien du vidéo" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Cela devrait être un lien vers une vidéo YouTube ou Vimeo, à savoir: http://" "www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "vidéo" #: content/video/models.py:31 msgid "videos" msgstr "vidéos" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "publié" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Il est utilisé pour la navigation généré aussi." #: module/blog/models.py:33 msgid "published on" msgstr "publié le" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Sera mis automatiquement une fois que vous cochez la case «publié» ci-dessus." #: module/blog/models.py:39 msgid "entry" msgstr "entrée" #: module/blog/models.py:40 msgid "entries" msgstr "entrées" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "mots-clé" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "traduction de" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "traductions disponibles" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "date de création" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "date de modification" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "types de contenu" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "date de la publication" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "date de termination de la publication" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Laissez vide si l'entrée doit rester active pour toujours." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "visible de - à" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "" #: module/extensions/featured.py:9 msgid "featured" msgstr "" #: module/extensions/featured.py:14 msgid "Featured" msgstr "" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "termes meta" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Ce sera ajouté à la liste de mots clés par défaut." #: module/extensions/seo.py:11 msgid "meta description" msgstr "description meta" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Ce sera ajouté à la description par défaut." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Modifier la traduction" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Créer traduction" #: module/extensions/translations.py:200 msgid "translations" msgstr "traductions" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Prévisualiser" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "taille" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "crée" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "type de fichier" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "parent" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "télougou" #: module/medialibrary/models.py:49 msgid "category" msgstr "catégorie" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "catégories" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "image" #: module/medialibrary/models.py:203 msgid "Video" msgstr "" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "Document PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "texte" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Données binaires" #: module/medialibrary/models.py:236 msgid "description" msgstr "description" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "traductions du fichier de média" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "traductions des fichiers de média" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Cette URL est déjà prise par une page active." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Cette URL est déjà pris par une autre page active." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Autres options" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "à la navigation" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Ajouter page enfant" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Voir sur le site" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "hérité" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "extensions" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "" #: module/page/models.py:138 msgid "active" msgstr "actif" #: module/page/models.py:146 msgid "override URL" msgstr "adresse URL forcée" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Outrepasser l'URL cible. N'oubliez pas d'inclure des barres obliques au " "début et à la fin s'il s'agit d'une URL locale. Cela affecte la navigation " "et les adresses URL des sous-pages." #: module/page/models.py:148 msgid "redirect to" msgstr "rediriger à" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL pour redirections automatiques" #: module/page/models.py:150 msgid "Cached URL" msgstr "adresse URL temporairement enregistrée" #: module/page/models.py:161 msgid "page" msgstr "page" #: module/page/models.py:162 msgid "pages" msgstr "pages" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "additif de la navigation" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Sélectionnez le module fournissant pages pour cette page si vous avez besoin " "de personnaliser la navigation." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Tout le contenu est hérité de cette page si donnée." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "titre du contenu" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" "La première ligne est le titre principal, les lignes suivantes sont des sous-" "titres." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "titre de la page" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Titre de la page pour fenêtre de navigateur. Même que le titre par défaut." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "Par %(filter_title)s " #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Recherche" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Vraiment supprimer cet élément?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Affirmer pour supprimer l'élément" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "L'objet a été supprimé avec succès." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Impossible de supprimer cet élément" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Impossible de supprimer l'élément, parce qu'il est le parent d'au moins un " "autre élément." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Changer modèle" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "" "Réellement changer de modèle?
    Toutes les modifications sont " "enregistrées." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Réellement changer de modèle?
    Toutes les modifications sont " "enregistrées et le contenu de %(source_regions)s est " "déplacé vers %(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Région vide" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Contenu du site parent est automatiquement hérité. Pour contourner ce " "comportement, ajoutez un peu de contenu." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Ajouter un autre" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Enregistrer" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "traiter" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nouveau" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "vers le haut" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "vers le bas" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "supprimer" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Page d'accueil" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Raccourcis" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Réduire l'arbre" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Développer l'arborescence" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtre" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "" #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" #: templates/content/comments/default.html:28 msgid "No comments." msgstr "" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Envoyer" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Merci!" feincms-1.7.4/feincms/locale/hr/000077500000000000000000000000001212255543400164465ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/hr/LC_MESSAGES/000077500000000000000000000000001212255543400202335ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/hr/LC_MESSAGES/django.mo000066400000000000000000000321251212255543400220350ustar00rootroot00000000000000\  `2H$d 9 1(.5< T_Dr  ff&   t(# 45-cs   8  4   %*16L[  #:?DG,1?.qc237kr xGI#;C JVj          %16;AIQW _js x         0< M[mr     $ 1 = JV ]g |   # 8 G T Y \ b m t  c&"""$" "/" #:#J#P#BT#######O# N$ Y$e$ x$$q$$%5%F%6]%%%% % %%% %y%i&p&#u&&&&J&1'G'W'l' {' '''''' (U( ))!) )) 3)>)E)0*I*Z*l*****D*j+++ ++++1+, ,>,R,4,; -*G-ir-)-;.B.I."O.Hr.I.(/./5/ =/H/\/q/// / / ///// // 00#0*0/050;0 A0L0T0\0 e0 p0z000 0000 0 0 000111,1>1Y1u1 11 1111 111122 2 '232<2 V2 a2n2 2 22222223&3F3L3T3\3a3h3333 3333333 4 444$4 *4 84E4$ustT;"4}ZqH&z|kNMc,< _m UnFeCfrlQg=K3[)*w+-8>WY/27G.^B~'`{b jv0pA OVoS\@E!Ry: ?h( ]1dJ9x6P#%DILa5iX %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%s has been moved to a new position.(no caption)Add a brief excerpt summarizing the content of this page.Add child pageAdd new itemAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCannot delete itemCannot delete item, because it is parent of at least one other item.CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create hidden copy of this pageCreate translationDate-based publishingDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordMoveMove toNavigation extensionNew comments may be addedNo comments.Other optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.ParentPost CommentPreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyRelated pagesReplace page %(to_replace)sRich TextSaveSearchSearch engine optimizationSelect pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSymlinked pageTarget URL for automatic redirects.TextThanks!The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You have replaced %s. You may continue editing the now-active page below.You may edit the copied page below.actionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich text (ckeditor)rich textsrich texts (ckeditor)rightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2010-09-15 14:29+0200 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Bojan Mihelac Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3); %(comment_username)s je objavio %(comment_submit_date)s
    Po %(filter_title)s %(comment_count)s komentara.%s je premještena na novu poziciju.(bez naslova)Dodajte kratak sažetak sadržaja ove stranice.Dodaj podređenu stranicuDodaj novi unosNakonSviSav sadržaj je nasljeđen od ove stranice ukoliko je postavljena.AudioPrijeBinarniMasovni prijenos ZIP datotekom:Keširana adresa (URL)Zapis ne može biti obrisanZapis ne može biti obrisan jer je nadređeni od najmanje jednog drugog zapisa.KategorijaPromjeni %sZamjena predložkaSažmi drvoPotvrdite brisanje zapisaSadržaj je automatski naslijeđen od nadređene stranice. Ukoliko želite to promjeniti, dodajte neke sadržaje.Kreiraj skrivenu kopiju ove straniceKreiraj prijevodObjava vezana na datumUputa za premještanje nije uspješno interpretirana. Uredi na stranicamaUredi prijevodSažetakProširi drvoIstaknutiFilterFlashHTML TidyHTML provjera je pokazala %(count)d upozorenja. Molimo pregledajte ažurirani sadržaj ispod prije nastavka: %(messages)sSakrijHomeZanemariti upozorenja HTML provjereSlikaUmetni ispred:Zapis je uspješno izbrisanOstavite praznim ukoliko članak treba biti aktivan neograničeno vrijeme.Ostavite ovo prazno za zapise u primarnom jeziku.Microsoft ExcelMicrosoft PowerPointMicrosoft WordPremjestiPremjesti unavigacijska ekstenzijaNovi komentari mogu biti dodaniBez komentara.Druge mogućnostiNadjačati ciljnu adresu (URL). Budite sigurni da uključite kose crte na početku i kraju ukoliko se odnosi na lokalnu adresu. Ovo se odnosi i na navigaciju i na adrese podstranicaPDF dokumentNaslov stranice u prozoru browsera. Podrazumijevana vrijednost je jednako kao naslov.NadređeniPošalji komentarPregledRSS kanalRSS kanaliZaista zamijeniti predložak?
    Sve izmjene su spremljene. i sadržaj iz %(source_regions)s će biti premješten u %(target_region)s.Zaista zamijeniti predložak?
    Sve izmjene će biti spremljene.Stvarno izbrisati zapis?Regija je praznaPovezane straniceZamjeni stranicu %(to_replace)sFormatirani tekstSpremiPretraživanjeOptimizacija za tražiliceOdaberite stranice koje trebaju biti navedene kao povezani sadržaj.Odaberite modul koji će dostaviti podstranice za ovu stranicu ukoliko je potrebno prilagoditi navigaciju.PošaljiKraticePsrikažiPrekini uređivanjePotvrdisimbolički povezana stranicaCiljna adresa (URL) za automatsko preusmjeravanjeTekstHvala!Prva linija je glavni naslov, slijedeće linije su podnaslovi.RSS polje se ažurira nekoliko puta dnevno. Promjena u naslovu će biti vidljiva na naslovnici nakon sljedećeg ažuriranja kanala.Ova adresa (URL) je već zauzeta aktivnom stranicom.Ova adresa (URL) je već zauzeta drugom aktivnom stranicom.Ovo se koristi i za generiranu navigaciju.Polje treba sadržavati link na youtube ili vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0Ovo će biti dodano predefiniranom opisu.Ovo će biti dodano predefiniranoj listi ključnih riječi.NaziviVideoPogledaj na internetnim stranicamaBiti će automatski postavljeno kada označite `objavljeno` polje iznad.Zamijenili ste %s. Možete nastaviti uređivati neaktivnu stranicu ispod.Možete urediti kopiranu stranicu ispod.akcijeaktivanaplikacijasadržaj aplikacijesadržaji aplikacijedostupni prijevodibloknaslovkategorijekategorijakomentarikontaktni obrazackontaktni obrazcisadržajnaslov sadržajatip sadržajaautorsko pravokreirandatum kreiranjapodaciopisdoljeurediemailomogućenočlancičlanaksažetakekstenzijeistaknutidatotekainformacije o datoteciveličina datoteketip datotekedatotekeslikaslikeu navigacijinaslijeđenoje aktivnajezikzadnji put osvježenolijevolinknajviše zapisamedijska datotekaprijevod medijske datotekeprijevodi medijske datotekemedijske datotekemeta opismeta ključne riječidatum izmjeneimenavigacijska ekstenzijanovineobjavljenoporedaknadjačati URLstranicanaslov stranicestranicenadređenijednostavnopozicijapred pripremljen sadržajobjavljenodatum objavedatum kraja objaveobjavljenoobjavljeno naneformatirani sadržajneformatirani sadržajipreusmjeriti naizbrišiformatirani tekstformatirani tekst (ckeditor)formatirani tekstoviformatirani tekstovi (ckeditor)desnosekcijasekcijeslugnaslovsimbolički povezana stranicatablicatabliceetiketepredložaksadržaj predloškasadržaji predloškatekstnazivnaslovni redaknaslovni redak i kolonaprijevod odprijevoditipgorevideolink na videovideo zapisividljiv od - dofeincms-1.7.4/feincms/locale/hr/LC_MESSAGES/django.po000066400000000000000000000603531212255543400220440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Bojan Mihelac , 2010. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: LANGUAGE \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "predložak" #: models.py:551 msgid "ordering" msgstr "poredak" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "jezik" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Svi" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Nadređeni" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Kategorija" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Promjeni %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "naziv" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s je premještena na novu poziciju." #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "Uputa za premještanje nije uspješno interpretirana. " #: admin/tree_editor.py:417 msgid "actions" msgstr "akcije" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Stvarno izbrisati zapis?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "sadržaj aplikacije" #: content/application/models.py:273 msgid "application contents" msgstr "sadržaji aplikacije" #: content/application/models.py:298 msgid "application" msgstr "aplikacija" #: content/comments/models.py:24 msgid "enabled" msgstr "omogućeno" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Novi komentari mogu biti dodani" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "komentari" #: content/comments/models.py:49 msgid "public" msgstr "objavljeno" #: content/comments/models.py:49 msgid "not public" msgstr "neobjavljeno" #: content/contactform/models.py:18 msgid "name" msgstr "ime" #: content/contactform/models.py:19 msgid "email" msgstr "email" #: content/contactform/models.py:20 msgid "subject" msgstr "naslov" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "sadržaj" #: content/contactform/models.py:34 msgid "contact form" msgstr "kontaktni obrazac" #: content/contactform/models.py:35 msgid "contact forms" msgstr "kontaktni obrazci" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "datoteka" #: content/file/models.py:26 msgid "files" msgstr "datoteke" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "slika" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "naslov" #: content/image/models.py:53 msgid "images" msgstr "slike" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "pozicija" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(bez naslova)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "medijska datoteka" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "medijske datoteke" #: content/medialibrary/models.py:139 msgid "block" msgstr "blok" #: content/medialibrary/models.py:140 msgid "left" msgstr "lijevo" #: content/medialibrary/models.py:141 msgid "right" msgstr "desno" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "tip" #: content/raw/models.py:18 msgid "raw content" msgstr "neformatirani sadržaj" #: content/raw/models.py:19 msgid "raw contents" msgstr "neformatirani sadržaji" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Zanemariti upozorenja HTML provjere" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "HTML provjera je pokazala %(count)d upozorenja. Molimo pregledajte ažurirani " "sadržaj ispod prije nastavka: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "tekst" #: content/richtext/models.py:85 msgid "rich text" msgstr "formatirani tekst" #: content/richtext/models.py:86 msgid "rich texts" msgstr "formatirani tekstovi" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "RSS polje se ažurira nekoliko puta dnevno. Promjena u naslovu će biti " "vidljiva na naslovnici nakon sljedećeg ažuriranja kanala." #: content/rss/models.py:22 msgid "link" msgstr "link" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "pred pripremljen sadržaj" #: content/rss/models.py:24 msgid "last updated" msgstr "zadnji put osvježeno" #: content/rss/models.py:25 msgid "max. items" msgstr "najviše zapisa" #: content/rss/models.py:29 msgid "RSS feed" msgstr "RSS kanal" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "RSS kanali" #: content/section/models.py:41 msgid "section" msgstr "sekcija" #: content/section/models.py:42 msgid "sections" msgstr "sekcije" #: content/table/models.py:66 msgid "plain" msgstr "jednostavno" #: content/table/models.py:67 msgid "title row" msgstr "naslovni redak" #: content/table/models.py:69 msgid "title row and column" msgstr "naslovni redak i kolona" #: content/table/models.py:75 msgid "table" msgstr "tablica" #: content/table/models.py:76 msgid "tables" msgstr "tablice" #: content/table/models.py:90 msgid "data" msgstr "podaci" #: content/template/models.py:51 msgid "template content" msgstr "sadržaj predloška" #: content/template/models.py:52 msgid "template contents" msgstr "sadržaji predloška" #: content/video/models.py:25 msgid "video link" msgstr "link na video" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Polje treba sadržavati link na youtube ili vimeo video, i.e.: http://www." "youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "video" #: content/video/models.py:31 msgid "videos" msgstr "video zapisi" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "objavljeno" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Ovo se koristi i za generiranu navigaciju." #: module/blog/models.py:33 msgid "published on" msgstr "objavljeno na" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "Biti će automatski postavljeno kada označite `objavljeno` polje iznad." #: module/blog/models.py:39 msgid "entry" msgstr "članak" #: module/blog/models.py:40 msgid "entries" msgstr "članci" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "etikete" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "prijevod od" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Ostavite ovo prazno za zapise u primarnom jeziku." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "dostupni prijevodi" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "datum kreiranja" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "datum izmjene" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "tip sadržaja" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "datum objave" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "datum kraja objave" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "" "Ostavite praznim ukoliko članak treba biti aktivan neograničeno vrijeme." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "vidljiv od - do" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Objava vezana na datum" #: module/extensions/featured.py:9 msgid "featured" msgstr "istaknuti" #: module/extensions/featured.py:14 msgid "Featured" msgstr "Istaknuti" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta ključne riječi" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Ovo će biti dodano predefiniranoj listi ključnih riječi." #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta opis" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Ovo će biti dodano predefiniranom opisu." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Optimizacija za tražilice" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Uredi prijevod" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Kreiraj prijevod" #: module/extensions/translations.py:200 msgid "translations" msgstr "prijevodi" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Pregled" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "veličina datoteke" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "kreiran" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "tip datoteke" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "informacije o datoteci" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "nadređeni" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "kategorija" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "kategorije" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "autorsko pravo" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Slika" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Video" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Audio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "PDF dokument" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Tekst" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Formatirani tekst" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binarni" #: module/medialibrary/models.py:236 msgid "description" msgstr "opis" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "prijevod medijske datoteke" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "prijevodi medijske datoteke" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Ova adresa (URL) je već zauzeta aktivnom stranicom." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Ova adresa (URL) je već zauzeta drugom aktivnom stranicom." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Druge mogućnosti" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "u navigaciji" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Dodaj podređenu stranicu" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Pogledaj na internetnim stranicama" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "naslijeđeno" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "ekstenzije" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "je aktivna" #: module/page/models.py:138 msgid "active" msgstr "aktivan" #: module/page/models.py:146 msgid "override URL" msgstr "nadjačati URL" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Nadjačati ciljnu adresu (URL). Budite sigurni da uključite kose crte na " "početku i kraju ukoliko se odnosi na lokalnu adresu. Ovo se odnosi i na " "navigaciju i na adrese podstranica" #: module/page/models.py:148 msgid "redirect to" msgstr "preusmjeriti na" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "Ciljna adresa (URL) za automatsko preusmjeravanje" #: module/page/models.py:150 msgid "Cached URL" msgstr "Keširana adresa (URL)" #: module/page/models.py:161 msgid "page" msgstr "stranica" #: module/page/models.py:162 msgid "pages" msgstr "stranice" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "sažetak" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "Dodajte kratak sažetak sadržaja ove stranice." #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Sažetak" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "navigacijska ekstenzija" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Odaberite modul koji će dostaviti podstranice za ovu stranicu ukoliko je " "potrebno prilagoditi navigaciju." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "navigacijska ekstenzija" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Odaberite stranice koje trebaju biti navedene kao povezani sadržaj." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Povezane stranice" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "simbolički povezana stranica" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Sav sadržaj je nasljeđen od ove stranice ukoliko je postavljena." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "naslov sadržaja" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "Prva linija je glavni naslov, slijedeće linije su podnaslovi." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "naslov stranice" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Naslov stranice u prozoru browsera. Podrazumijevana vrijednost je jednako " "kao naslov." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Nazivi" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr " Po %(filter_title)s " #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Pretraživanje" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Stvarno izbrisati zapis?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Potvrdite brisanje zapisa" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Zapis je uspješno izbrisan" #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Zapis ne može biti obrisan" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Zapis ne može biti obrisan jer je nadređeni od najmanje jednog drugog zapisa." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Zamjena predložka" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Zaista zamijeniti predložak?
    Sve izmjene će biti spremljene." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Zaista zamijeniti predložak?
    Sve izmjene su spremljene. i sadržaj iz " "%(source_regions)s će biti premješten u " "%(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Sakrij" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Psrikaži" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Nakon" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Prije" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Umetni ispred:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Regija je prazna" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Sadržaj je automatski naslijeđen od nadređene stranice. Ukoliko želite to " "promjeniti, dodajte neke sadržaje." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Dodaj novi unos" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Spremi" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Prekini uređivanje" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "uredi" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "novi" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "gore" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "dolje" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "izbriši" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Home" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Kratice" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Sažmi drvo" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Proširi drvo" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filter" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Uredi na stranicama" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Masovni prijenos ZIP datotekom:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Pošalji" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s komentara." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s je objavio " "%(comment_submit_date)s
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Bez komentara." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Pošalji komentar" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Potvrdi" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Hvala!" #~ msgid "Symlinked page" #~ msgstr "simbolički povezana stranica" feincms-1.7.4/feincms/locale/it/000077500000000000000000000000001212255543400164515ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/it/LC_MESSAGES/000077500000000000000000000000001212255543400202365ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/it/LC_MESSAGES/django.mo000066400000000000000000000326431212255543400220450ustar00rootroot00000000000000d  $% JW[x 1  "-4DG  f;N'd&  t}# 45K` z  H R8_ BD4< EO4 1 R_f ~6[' ,6; @M#Tx}DA ,1.c 23 G<M   2IO Wbk t          )39? F T ^h q~     $ (3 <I NY_flu           ( 7 = D I R c u z        U C"X"t"/"""""&#+#D#Y#^#Bd#### ###T# P$ Z$f$ y$"${$&%6%(L% u%*%%%% %%%w%w&&&%&&&!&H&AC''&''' '( ( (w(M)V)Oh)f) *)*2*;*P*#9+&]+ ++"+ +++B+t,, ,,,,,.,,,P-ES--14.6f.6.y.5N/@/// /k/?L0000 0000 11(1?1V1 ]1 h1 r1 |111 111 1112 222!2(2 /2 :2F2 K2U2 i2v2|222 22222 2 2223=3O3 `3n3333 33333333 34 4)4C4 [4 f4 t4 444 4444444444 455$5*515A5 [5 i5t5y5|5 555n'E|Q{V>;%2][xK(Zr~POif/<8t Wu}eFmls `qh?M:I^-=.07bS@G \6dJ1a"Dy)Xcw CRYvU_B$T# Ao+ !N*jL,94H&gz53pk By %(filter_title)s %(comment_count)s comments.%d files imported%s has been moved to a new position.(no caption)AddAdd another %(verbose_name)sAdd child pageAdd media files to categoryAdd new itemAdd to categoryAfterAllAll content is inherited from this page if given.BeforeBinaryBulk upload a ZIP file:Cached URLCancelCannot delete itemCannot delete item, because it is parent of at least one other item.CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create translationDate-based publishingDelete selected %(verbose_name_plural)sDescription of imageDid not understand moving instruction.Edit on siteEdit translationExpand treeFeaturedFilterFlashHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHistoryHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Navigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.OverwritePDF documentPage title for browser window. Same as title by default.ParentPost CommentPress the save button below to recover this version of the object.Press the save button below to revert to this version of the object.PreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Recover deleted %(verbose_name)sRegion emptyRemoveRevert %(verbose_name)sRich TextSaveSearchSelect pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowSiteStop EditingSubmitTarget URL for automatic redirects.TextThanks!The first line is the main title, the following lines are subtitles.The following media files will be added to the selected category:The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You don't have the necessary permissions to edit this objectZIP file export failed: %sZIP file exported as %sZIP import failed: %sZip archiveactionsactivealternate textapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FeinCMS Report-Msgid-Bugs-To: POT-Creation-Date: 2012-08-11 13:53+0200 PO-Revision-Date: 2012-08-14 17:41+0100 Last-Translator: Paolo Dina Language-Team: LANGUAGE Language: it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1) Da %(filter_title)s %(comment_count)s commenti.%d file importati%s è stato spostato in una nuova posizione. (no didascalia)AggiungiAggiungi altro %(verbose_name)sAggiungi sottopaginaAggiungi file multimediali a categoriaAggiungi nuovo contenutoAggiungi a categoriaDopoTuttoTutti i contenuti sono ereditati da questa pagina, se specificata.PrimaBinarioCarica un file ZIP:Cache URLAnnullaImpossibile eliminare contenutoImpossibile eliminare elemento, perché è genitore di almeno un altro elemento.categoriaModifica% sCambia tipo paginaChiudi alberoConferma di eliminazione contenutoIl contenuto della pagina genitore viene ereditato automaticamente. Per evitare che ciò accada Aggiungi nuovi contenuti.Crea traduzioneDate di pubblicazioneElimina %(verbose_name_plural)s elementidescrizioneIstruzione di spostamento non riconosciutaModifica sul sitoModificare la traduzioneEspandi alberoIn evidenzaFiltroFlashLa validazione HTML ha prodotto %(count)d avvisi. Prima di continuarerivedi il contenuto aggiornato sotto: %(messages)sNascondiStoriaPagina principaleIgnora gli avvisi di validazione HTMLImmagineInserisci nuovoContenuto eliminato con successo.Non specificare data e ora se la pagina deve rimanere attiva per sempre.Lasciare vuoto questo campo per le voci in lingua primaria (% s).estensione di navigazioneE' possibile aggiungere nuovi commentiNessun commento.File in input non specificatoAltre opzioniSovrascrivere l'URL di destinazione. Assicurati di includere le barre all'inizio e alla fine se si tratta di un URL locale. Questo riguarda sia la navigazione e gli URL sottopagine '.SovrascriviDocumento PDFTitolo della pagina per la finestra del browser. Per impostazione predefinita assume lo stesso valore del campo Titolo.GenitorePubblica commentoPremi il pulsante salva qua sotto per ripristinare questaversione dell'oggetto.Premi il pulsante salva qua sotto per annullare le modificheeffettuate a questa versione dell'oggetto.AnteprimaFeed RSSFeed RSSDavvero cambiare modello?
    Tutte le modifiche vengono salvate e il contenuto da %(source_regions)s è spostato %(target_region)s.Vuoi davvero cambiare tipo di pagina?
    Tutte le modifiche vengono salvate.Vuoi davvero eliminare questa voce?Ripristina cancellati %(verbose_name)sRegione vuotaRimuoviAnnulla modifiche %(verbose_name)srich textSalvaRicercaSeleziona le pagine da elencare come in relazione a questa pagina.Selezionare il modulo che fornisce sottopagine per questa pagina, se avete bisogno di personalizzare la navigazione.InviaScorciatoieMostraSitoInterrompi modificaInviaURL di destinazione per i redirect automatici.TestoGrazie!La prima riga rappresenta il titolo principale, le righe seguenti i sottotitoli.I seguenti file multimediali saranno aggiunti a categoriaselezionata:Il campo rss viene aggiornato più volte al giorno. Una modifica del titolo sarà visibile in home page solo dopo il successivo aggiornamento del feed.Questo URL è già usato da una pagina attiva.Questo URL è già usato da un'altra pagina attiva.E' anche usato per generare il sistema di navigazione.Questo dovrebbe essere un link ad un video di YouTube o di Vimeo, vale a dire: http://www.youtube.com/watch?v=zmj1rpzDRZ0Questo sarà anteposto alla descrizione predefinita.Questo sarà anteposto all'elenco di parole chiave predefinite.TitolivideoVedi sul sitoVerrà impostato automaticamente una volta che spunti la casella di controllo `` pubblicato in precedenza.Non possiedi i permessi necessari per modificare questo oggettoFile ZIP non valido: %sFile ZIP non valido: %sFile ZIP non valido: %sArchivio Zipazioniattivoalternativa testualeapplicazionecontenuto applicazionecontenuti applicazionetraduzioni disponibilibloccodidascaliacategoriecategoriacontenutomodulo di contattomoduli di contattocontenutotitolo del contenutotipi di contenutocopyrightcreatodata di creazionedatidescrizionegiùmodificae-mailtavoloestensioniin evidenzafilefile infodimensione del filetipo di filefilesimageimmaginiin navigazioneereditatoattivolinguaUltimo aggiornamentosinistracollegamentomax. elementifile multimedialetraduzione di file multimedialetraduzioni di file multimedialefile multimedialimeta descriptionmeta keywordsdata di modificanomeestensione di navigazionenuovonon pubblicoordinesovrascrivi URLpaginatitolo della paginapaginegenitoreplainPosizionepre-rendering di contenutipubblicatodata inizio pubblicazionedata fine pubblicazionepubblicatopubblicato ilraw contenutiraw contenutiredirectrimuovirich textdestrasezionesezionislugsoggettopagina collegatatabellatabelletagstipo paginacontenuto paginacontenuti paginatestoTitoloriga del titoloriga del titolo e colonnatraduzione ditraduzionitiposuvideovideo linkvideovisibile da - afeincms-1.7.4/feincms/locale/it/LC_MESSAGES/django.po000066400000000000000000000610061212255543400220430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-11 13:53+0200\n" "PO-Revision-Date: 2012-08-14 17:41+0100\n" "Last-Translator: Paolo Dina\n" "Language-Team: LANGUAGE \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "tipo pagina" #: models.py:551 msgid "ordering" msgstr "ordine" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "lingua" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Tutto" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Genitore" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "categoria" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Modifica% s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "Titolo" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s è stato spostato in una nuova posizione. " #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "Istruzione di spostamento non riconosciuta" #: admin/tree_editor.py:417 msgid "actions" msgstr "azioni" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Cancellati con successo %s elementi." #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "Elimina %(verbose_name_plural)s elementi" #: content/application/models.py:272 msgid "application content" msgstr "contenuto applicazione" #: content/application/models.py:273 msgid "application contents" msgstr "contenuti applicazione" #: content/application/models.py:298 msgid "application" msgstr "applicazione" #: content/comments/models.py:24 msgid "enabled" msgstr "tavolo" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "E' possibile aggiungere nuovi commenti" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "contenuto" #: content/comments/models.py:49 msgid "public" msgstr "pubblicato" #: content/comments/models.py:49 msgid "not public" msgstr "non pubblico" #: content/contactform/models.py:18 msgid "name" msgstr "nome" #: content/contactform/models.py:19 msgid "email" msgstr "e-mail" #: content/contactform/models.py:20 msgid "subject" msgstr "soggetto" #: content/contactform/models.py:23 #: content/raw/models.py:14 msgid "content" msgstr "contenuto" #: content/contactform/models.py:34 msgid "contact form" msgstr "modulo di contatto" #: content/contactform/models.py:35 msgid "contact forms" msgstr "moduli di contatto" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "file" #: content/file/models.py:26 msgid "files" msgstr "files" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "image" #: content/image/models.py:46 msgid "alternate text" msgstr "alternativa testuale" #: content/image/models.py:47 msgid "Description of image" msgstr "descrizione" #: content/image/models.py:48 #: module/medialibrary/models.py:233 msgid "caption" msgstr "didascalia" #: content/image/models.py:53 msgid "images" msgstr "immagini" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "Posizione" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(no didascalia)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "file multimediale" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "file multimediali" #: content/medialibrary/models.py:139 msgid "block" msgstr "blocco" #: content/medialibrary/models.py:140 msgid "left" msgstr "sinistra" #: content/medialibrary/models.py:141 msgid "right" msgstr "destra" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "tipo" #: content/raw/models.py:18 msgid "raw content" msgstr "raw contenuti" #: content/raw/models.py:19 msgid "raw contents" msgstr "raw contenuti" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Ignora gli avvisi di validazione HTML" #: content/richtext/models.py:47 #, python-format msgid "HTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)s" msgstr "La validazione HTML ha prodotto %(count)d avvisi. Prima di continuarerivedi il contenuto aggiornato sotto: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "testo" #: content/richtext/models.py:85 msgid "rich text" msgstr "rich text" #: content/richtext/models.py:86 msgid "rich texts" msgstr "" #: content/rss/models.py:21 msgid "The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update." msgstr "Il campo rss viene aggiornato più volte al giorno. Una modifica del titolo sarà visibile in home page solo dopo il successivo aggiornamento del feed." #: content/rss/models.py:22 msgid "link" msgstr "collegamento" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "pre-rendering di contenuti" #: content/rss/models.py:24 msgid "last updated" msgstr "Ultimo aggiornamento" #: content/rss/models.py:25 msgid "max. items" msgstr "max. elementi" #: content/rss/models.py:29 msgid "RSS feed" msgstr "Feed RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "Feed RSS" #: content/section/models.py:41 msgid "section" msgstr "sezione" #: content/section/models.py:42 msgid "sections" msgstr "sezioni" #: content/table/models.py:66 msgid "plain" msgstr "plain" #: content/table/models.py:67 msgid "title row" msgstr "riga del titolo" #: content/table/models.py:69 msgid "title row and column" msgstr "riga del titolo e colonna" #: content/table/models.py:75 msgid "table" msgstr "tabella" #: content/table/models.py:76 msgid "tables" msgstr "tabelle" #: content/table/models.py:90 msgid "data" msgstr "dati" #: content/template/models.py:51 msgid "template content" msgstr "contenuto pagina" #: content/template/models.py:52 msgid "template contents" msgstr "contenuti pagina" #: content/video/models.py:25 msgid "video link" msgstr "video link" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Questo dovrebbe essere un link ad un video di YouTube o di Vimeo, vale a " "dire: http://www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "video" #: content/video/models.py:31 msgid "videos" msgstr "video" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "pubblicato" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "E' anche usato per generare il sistema di navigazione." #: module/blog/models.py:33 msgid "published on" msgstr "pubblicato il" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "Verrà impostato automaticamente una volta che spunti la casella di controllo `` pubblicato in precedenza." #: module/blog/models.py:39 msgid "entry" msgstr "" #: module/blog/models.py:40 msgid "entries" msgstr "" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "tags" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "traduzione di" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Lasciare vuoto questo campo per le voci in lingua primaria (% s)." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "traduzioni disponibili" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "data di creazione" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "data di modifica" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "tipi di contenuto" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "data inizio pubblicazione" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "data fine pubblicazione" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Non specificare data e ora se la pagina deve rimanere attiva per sempre." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "visibile da - a" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Date di pubblicazione" #: module/extensions/featured.py:9 msgid "featured" msgstr "in evidenza" #: module/extensions/featured.py:14 msgid "Featured" msgstr "In evidenza" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta keywords" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Questo sarà anteposto all'elenco di parole chiave predefinite." #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta description" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Questo sarà anteposto alla descrizione predefinita." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "Cannot overwrite with different file type (attempt to overwrite a %(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 msgid "ZIP file exported as %s" msgstr "File ZIP non valido: %s" #: module/medialibrary/modeladmins.py:86 msgid "ZIP file export failed: %s" msgstr "File ZIP non valido: %s" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Anteprima" #: module/medialibrary/modeladmins.py:139 #: module/medialibrary/models.py:87 msgid "file size" msgstr "dimensione del file" #: module/medialibrary/modeladmins.py:144 #: module/medialibrary/models.py:85 msgid "created" msgstr "creato" #: module/medialibrary/modeladmins.py:163 #: module/medialibrary/models.py:84 msgid "file type" msgstr "tipo di file" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "file info" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "%d file importati" #: module/medialibrary/modeladmins.py:198 msgid "ZIP import failed: %s" msgstr "File ZIP non valido: %s" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "File in input non specificato" #: module/medialibrary/models.py:43 msgid "parent" msgstr "genitore" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "categoria" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "categorie" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Immagine" #: module/medialibrary/models.py:203 msgid "Video" msgstr "video" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "Documento PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Testo" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "rich text" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "Archivio Zip" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binario" #: module/medialibrary/models.py:236 msgid "description" msgstr "descrizione" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "traduzione di file multimediale" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "traduzioni di file multimediale" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Questo URL è già usato da una pagina attiva." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Questo URL è già usato da un'altra pagina attiva." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Altre opzioni" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "in navigazione" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Aggiungi sottopagina" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Vedi sul sito" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "Non possiedi i permessi necessari per modificare questo oggetto" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "ereditato" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "estensioni" #: module/page/modeladmins.py:167 #: module/page/models.py:179 msgid "is active" msgstr "attivo" #: module/page/models.py:138 msgid "active" msgstr "attivo" #: module/page/models.py:146 msgid "override URL" msgstr "sovrascrivi URL" #: module/page/models.py:265 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Sovrascrivere l'URL di destinazione. Assicurati di includere le barre all'inizio " "e alla fine se si tratta di un URL locale. Questo riguarda sia la " "navigazione e gli URL sottopagine '." #: module/page/models.py:148 msgid "redirect to" msgstr "redirect" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL di destinazione per i redirect automatici." #: module/page/models.py:150 msgid "Cached URL" msgstr "Cache URL" #: module/page/models.py:161 msgid "page" msgstr "pagina" #: module/page/models.py:162 msgid "pages" msgstr "pagine" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "estensione di navigazione" #: module/page/extensions/navigation.py:102 msgid "Select the module providing subpages for this page if you need to customize the navigation." msgstr "Selezionare il modulo che fornisce sottopagine per questa pagina, se avete bisogno di personalizzare la navigazione." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "estensione di navigazione" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Seleziona le pagine da elencare come in relazione a questa pagina." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "Sito" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "pagina collegata" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Tutti i contenuti sono ereditati da questa pagina, se specificata." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "titolo del contenuto" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "La prima riga rappresenta il titolo principale, le righe seguenti i sottotitoli." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "titolo della pagina" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "Titolo della pagina per la finestra del browser. Per impostazione predefinita assume lo stesso valore del campo Titolo." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Titoli" #: module/page/extensions/translations.py:171 msgid "Edit translation" msgstr "Modificare la traduzione" #: module/page/extensions/translations.py:174 msgid "Create translation" msgstr "Crea traduzione" #: module/page/extensions/translations.py:179 msgid "translations" msgstr "traduzioni" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "Da %(filter_title)s " #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Ricerca" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Vuoi davvero eliminare questa voce?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Conferma di eliminazione contenuto" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Contenuto eliminato con successo." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Impossibile eliminare contenuto" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "Impossibile eliminare elemento, perché è genitore di almeno un altro elemento." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Cambia tipo pagina" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Vuoi davvero cambiare tipo di pagina?
    Tutte le modifiche vengono salvate." #: templates/admin/feincms/_messages_js.html:9 #, python-format msgid "" "Really change template?
    All changes are saved and content from " "%(source_regions)s is moved to %(target_region)s." msgstr "" "Davvero cambiare modello?
    Tutte le modifiche vengono salvate e il " "contenuto da %(source_regions)s è spostato " "%(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Nascondi" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Mostra" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Dopo" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Prima" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Inserisci nuovo" # TODO: nuova/o? #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Regione vuota" #: templates/admin/feincms/content_editor.html:15 msgid "Content from the parent site is automatically inherited. To override this behaviour, add some content." msgstr "Il contenuto della pagina genitore viene ereditato automaticamente. Per evitare che ciò accada Aggiungi nuovi contenuti." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Aggiungi nuovo contenuto" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "Aggiungi altro %(verbose_name)s" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "Rimuovi" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Salva" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Interrompi modifica" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "modifica" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nuovo" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "su" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "giù" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "rimuovi" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Pagina principale" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "Ripristina cancellati %(verbose_name)s" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "Premi il pulsante salva qua sotto per ripristinare questaversione dell'oggetto." #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "Storia" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "Annulla modifiche %(verbose_name)s" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "Premi il pulsante salva qua sotto per annullare le modificheeffettuate a questa versione dell'oggetto." #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Scorciatoie" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Chiudi albero" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Espandi albero" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtro" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Modifica sul sito" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "Aggiungi" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "Aggiungi file multimediali a categoria" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "I seguenti file multimediali saranno aggiunti a categoriaselezionata:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "Aggiungi a categoria" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "Annulla" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Carica un file ZIP:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "Sovrascrivi" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Invia" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s commenti." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Nessun commento." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Pubblica commento" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Invia" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Grazie!" feincms-1.7.4/feincms/locale/nb/000077500000000000000000000000001212255543400164345ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/nb/LC_MESSAGES/000077500000000000000000000000001212255543400202215ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/nb/LC_MESSAGES/django.mo000066400000000000000000000312611212255543400220230ustar00rootroot00000000000000t ` j$ 97 FSY1] D '1 AOff&/ Vct | t"#'K Q]4x5, FS gu 8!Z anv 4"W k x 6[m r| #D,1.c.23 GI[#  .EK S^g p }      " ' 1 ;EKQ X f pz      !6 :E N[ `kqx~       ! ' / 8 = E T Z a f o           ) !_4""""'"#9#!M#o####9#####$$J($s$|$ $$$Y$%%"<%_%p%!%%%% %%%% %p&u&{&%&& &&8&3'6'F'['j'''' '' h(?u(((( ( ((,)) )))) ****14*ff** *****)+;+A+@G++1,7D,)|,l,2-9F----A-I-)*.T. h. r.~. ...... .. . ///'/ 6/ D/ N/X/g/ l/x/|////// //// ///// //0 00 0(0-0B0K0a0 x000 00000 0 00 01 111!1 :1D1U1 o1 y1 1 111 1 111111112 22 2 *252;2 B2L2a2 q2222 222Ny{^ /ZU#ep7@E6}:? rxgCfa]> z'("_sm&<~8YI9 KJXFoASV$ %i-Qb| d[;2,5hkWR=*B`0TO!D\.cnG1tLM+j34wvl)HqPu %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%d files imported%s has been moved to a new position.(no caption)Add a brief excerpt summarizing the content of this page.Add another %(verbose_name)sAdd child pageAdd new itemAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCannot delete itemCannot delete item, because it is parent of at least one other item.CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Could not access storageCreate hidden copy of this pageCreate translationDate-based publishingDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.ParentPost CommentPreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyRelated pagesRemoveReplace page %(to_replace)sRich TextSaveSearchSearch engine optimizationSelect pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSymlinked pageTarget URL for automatic redirects.TextThanks!The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You have replaced %s. You may continue editing the now-active page below.You may edit the copied page below.ZIP file invalid: %sZip archiveactionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textsrightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FeinCMS Report-Msgid-Bugs-To: POT-Creation-Date: 2011-03-09 13:20+0100 POT-Revision-Date: 2011-03-09 13:20+0100 Last-Translator: Håvard Grimelid Language-Team: nb MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %(comment_username)s sa på %(comment_submit_date)s
    For %(filter_title)s %(comment_count)s kommentarer.%d filer importert%s har blitt flytta til en ny posisjon.(ingen tittel)Legg til et kort sammendrag av innholdet på denne siden.Legg til enda et %(verbose_name)sLegg til undersideLegg til nytt objektEtterAlleDersom gitt, blir alt innhold blir arvet fra denne siden.LydFørBinærLast opp ZIP-filer:Mellomlagret URLKan ikke slette objektKan ikke slette objektet fordi det er foreldre til minst ett annet objekt.KategoriEndre %sEndre malSlå sammen treBekreft sletting av objektetInnhold fra forelder-side blir arvet automatisk. Overstyr dette ved å legge til innhold.Fikk ikke tilgang til lagringsenhetenOpprett skjult kopi av denne sidenLag oversettelseDatobasert publiseringForstod ikke flytteinstruksjonen.Rediger på nettstedRediger oversettelseUtdragUtvid treFeaturedFilterFlashHTML TidyHTML-validering produserte %(count)d advarsler. Revider oppdatert innhold under før du fortsetter: %(messages)sSkjulHjemIgnorer advarsler fra HTML-valideringBildeSett inn ny:Objekt slettet.La denne være tom dersom siden alltid skal være aktiv.La denne være tom for innlegg på primærspråket.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigasjonsutvidelseNye kommentarer kan legges tilIngen kommentarer.Ingen inputfil gittAndre valgOverstyr mål-URL. Inkluder skråstrek ved starten og ved slutten dersom det er en lokal URL. Dette gjelder både for navigasjons- og underside-URL-er.PDF-dokumentSidetittel for nettleservinduet. Samme som tittel som standard.ForelderPost kommentarForhåndsvisningRSS-strømRSS-strømmerEndre mal?
    Alle endringer blir lagret og innhold fra %(source_regions)s blir flyttet til %(target_region)s.Endre mal?
    Alle endringer blir lagret.Slette objektet?Tom regionRelaterte siderFjernErstatt side %(to_replace)sRik tekstLagreSøkSøkemotoroptimaliseringVelg sidene som skal listes som relatert innhold.Velg modulen som skal bidra med undersider til denne siden dersom du trenger å tilpasse navigasjonen.SendSnarveierVisAvslutt redigeringSend innSymbolsk linket sideMål-URL for automatiske videresendelser.TekstTakk!Første linje er hovedtittelen, følgende linjer er undertitler.RSS-strømmen blir oppdatert flere ganger om dagen. En endring i tittelel vil ikke bli synlig på nettsiden før etter neste oppdatering.Denne URL-en er allerede i bruk av en aktiv side.Denne URL-en er allerede i bruk av annen en aktiv side.Denne vil også bli brukt for navigasjon.Dette må være en link til en YouTube- eller Vimeo-film. F. eks. http://www.youtube.com/watch?v=zmj1rpzDRZ0Dette vil bli lagt inn foran standard beskrivelse.Dette vil bli lagt inn foran i standard nøkkelord-liste.TitlerVideoVis på nettstedBlir satt automatisk så snart `publisert`-boksen blir kryssa av.%s er erstattet. Du kan fortsette å redigere den nå aktive siden under.Du kan redigere den kopierte siden under.Ugyldig ZIP-fil: %sZIP-arkivaktiviteteraktivapplikasjonapplikasjonsinnholdapplikasjonsinnholdtilgjengelige oversettelserblokktittelkategorierkategorikommentarerkontaktskjemakontaktskjemaerinnholdinnholdstittelinnholdstypercopyrightopprettetopprettet datodatabeskrivelsenedredigerepostpåinnlegginnleggutdragutvidelserfeaturedfilfilinfofilstørrelsefiltypefilerbildebilderi navigasjonarveter aktivspråksist oppdatertvenstrelinkmaks antall objektermediafilmediafil-oversettelsemediafil-oversettelsermediafilermeta-beskrivelsemeta-nøkkelordendret datonavnnavigasjonsutvidelsenyikke offentligsorteringoverstyr URLsidesidetittelsiderforelderenkelposisjonforhåndsrendret innholdoffentligpubliseringsdatosluttdato for publiseringpublisertpublisert påråinnholdråinnholdvideresend tilfjernrik tekstrike teksterhøyreavsnittavsnittslugtemasymbolsk linket sidetabelltabellermerkelappermalmalinnholdmalinnholdteksttitteltittelradtittelrad og kolonneoversettelse avoversettelsertypeoppvideovideolinkvideoersynlig fra - tilfeincms-1.7.4/feincms/locale/nb/LC_MESSAGES/django.po000066400000000000000000000572671212255543400220440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Håvard Grimelid , 2011. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: LANGUAGE \n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "mal" #: models.py:551 msgid "ordering" msgstr "sortering" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "språk" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Alle" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Forelder" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Kategori" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Endre %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "tittel" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s har blitt flytta til en ny posisjon." #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "Forstod ikke flytteinstruksjonen." #: admin/tree_editor.py:417 msgid "actions" msgstr "aktiviteter" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Slette objektet?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "applikasjonsinnhold" #: content/application/models.py:273 msgid "application contents" msgstr "applikasjonsinnhold" #: content/application/models.py:298 msgid "application" msgstr "applikasjon" #: content/comments/models.py:24 msgid "enabled" msgstr "på" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Nye kommentarer kan legges til" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "kommentarer" #: content/comments/models.py:49 msgid "public" msgstr "offentlig" #: content/comments/models.py:49 msgid "not public" msgstr "ikke offentlig" #: content/contactform/models.py:18 msgid "name" msgstr "navn" #: content/contactform/models.py:19 msgid "email" msgstr "epost" #: content/contactform/models.py:20 msgid "subject" msgstr "tema" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "innhold" #: content/contactform/models.py:34 msgid "contact form" msgstr "kontaktskjema" #: content/contactform/models.py:35 msgid "contact forms" msgstr "kontaktskjemaer" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "fil" #: content/file/models.py:26 msgid "files" msgstr "filer" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "bilde" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "tittel" #: content/image/models.py:53 msgid "images" msgstr "bilder" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "posisjon" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(ingen tittel)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "mediafil" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "mediafiler" #: content/medialibrary/models.py:139 msgid "block" msgstr "blokk" #: content/medialibrary/models.py:140 msgid "left" msgstr "venstre" #: content/medialibrary/models.py:141 msgid "right" msgstr "høyre" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "type" #: content/raw/models.py:18 msgid "raw content" msgstr "råinnhold" #: content/raw/models.py:19 msgid "raw contents" msgstr "råinnhold" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Ignorer advarsler fra HTML-validering" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "HTML-validering produserte %(count)d advarsler. Revider oppdatert innhold " "under før du fortsetter: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "tekst" #: content/richtext/models.py:85 msgid "rich text" msgstr "rik tekst" #: content/richtext/models.py:86 msgid "rich texts" msgstr "rike tekster" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "RSS-strømmen blir oppdatert flere ganger om dagen. En endring i tittelel vil " "ikke bli synlig på nettsiden før etter neste oppdatering." #: content/rss/models.py:22 msgid "link" msgstr "link" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "forhåndsrendret innhold" #: content/rss/models.py:24 msgid "last updated" msgstr "sist oppdatert" #: content/rss/models.py:25 msgid "max. items" msgstr "maks antall objekter" #: content/rss/models.py:29 msgid "RSS feed" msgstr "RSS-strøm" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "RSS-strømmer" #: content/section/models.py:41 msgid "section" msgstr "avsnitt" #: content/section/models.py:42 msgid "sections" msgstr "avsnitt" #: content/table/models.py:66 msgid "plain" msgstr "enkel" #: content/table/models.py:67 msgid "title row" msgstr "tittelrad" #: content/table/models.py:69 msgid "title row and column" msgstr "tittelrad og kolonne" #: content/table/models.py:75 msgid "table" msgstr "tabell" #: content/table/models.py:76 msgid "tables" msgstr "tabeller" #: content/table/models.py:90 msgid "data" msgstr "data" #: content/template/models.py:51 msgid "template content" msgstr "malinnhold" #: content/template/models.py:52 msgid "template contents" msgstr "malinnhold" #: content/video/models.py:25 msgid "video link" msgstr "videolink" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Dette må være en link til en YouTube- eller Vimeo-film. F. eks. http://www." "youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "video" #: content/video/models.py:31 msgid "videos" msgstr "videoer" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "publisert" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Denne vil også bli brukt for navigasjon." #: module/blog/models.py:33 msgid "published on" msgstr "publisert på" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "Blir satt automatisk så snart `publisert`-boksen blir kryssa av." #: module/blog/models.py:39 msgid "entry" msgstr "innlegg" #: module/blog/models.py:40 msgid "entries" msgstr "innlegg" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "merkelapper" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "oversettelse av" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "La denne være tom for innlegg på primærspråket." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "tilgjengelige oversettelser" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "opprettet dato" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "endret dato" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "innholdstyper" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "publiseringsdato" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "sluttdato for publisering" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "La denne være tom dersom siden alltid skal være aktiv." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "synlig fra - til" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Datobasert publisering" #: module/extensions/featured.py:9 msgid "featured" msgstr "featured" #: module/extensions/featured.py:14 msgid "Featured" msgstr "Featured" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta-nøkkelord" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Dette vil bli lagt inn foran i standard nøkkelord-liste." #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta-beskrivelse" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Dette vil bli lagt inn foran standard beskrivelse." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Søkemotoroptimalisering" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Rediger oversettelse" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Lag oversettelse" #: module/extensions/translations.py:200 msgid "translations" msgstr "oversettelser" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Forhåndsvisning" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "filstørrelse" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "opprettet" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "filtype" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "filinfo" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "%d filer importert" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "Ingen inputfil gitt" #: module/medialibrary/models.py:43 msgid "parent" msgstr "forelder" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "kategori" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "kategorier" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Bilde" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Video" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Lyd" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "PDF-dokument" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Tekst" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Rik tekst" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "ZIP-arkiv" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binær" #: module/medialibrary/models.py:236 msgid "description" msgstr "beskrivelse" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "mediafil-oversettelse" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "mediafil-oversettelser" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Denne URL-en er allerede i bruk av en aktiv side." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Denne URL-en er allerede i bruk av annen en aktiv side." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Andre valg" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "i navigasjon" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Legg til underside" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Vis på nettsted" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "arvet" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "utvidelser" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "er aktiv" #: module/page/models.py:138 msgid "active" msgstr "aktiv" #: module/page/models.py:146 msgid "override URL" msgstr "overstyr URL" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Overstyr mål-URL. Inkluder skråstrek ved starten og ved slutten dersom det " "er en lokal URL. Dette gjelder både for navigasjons- og underside-URL-er." #: module/page/models.py:148 msgid "redirect to" msgstr "videresend til" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "Mål-URL for automatiske videresendelser." #: module/page/models.py:150 msgid "Cached URL" msgstr "Mellomlagret URL" #: module/page/models.py:161 msgid "page" msgstr "side" #: module/page/models.py:162 msgid "pages" msgstr "sider" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "utdrag" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "Legg til et kort sammendrag av innholdet på denne siden." #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Utdrag" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "navigasjonsutvidelse" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Velg modulen som skal bidra med undersider til denne siden dersom du trenger " "å tilpasse navigasjonen." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "Navigasjonsutvidelse" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Velg sidene som skal listes som relatert innhold." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Relaterte sider" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "symbolsk linket side" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Dersom gitt, blir alt innhold blir arvet fra denne siden." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "innholdstittel" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "Første linje er hovedtittelen, følgende linjer er undertitler." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "sidetittel" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "Sidetittel for nettleservinduet. Samme som tittel som standard." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Titler" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "For %(filter_title)s " #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Søk" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Slette objektet?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Bekreft sletting av objektet" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Objekt slettet." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Kan ikke slette objekt" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Kan ikke slette objektet fordi det er foreldre til minst ett annet objekt." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Endre mal" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Endre mal?
    Alle endringer blir lagret." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Endre mal?
    Alle endringer blir lagret og innhold fra " "%(source_regions)s blir flyttet til %(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Skjul" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Vis" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Etter" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Før" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Sett inn ny:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Tom region" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Innhold fra forelder-side blir arvet automatisk. Overstyr dette ved å legge " "til innhold." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Legg til nytt objekt" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Lagre" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Avslutt redigering" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "rediger" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "ny" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "opp" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "ned" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "fjern" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Hjem" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Snarveier" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Slå sammen tre" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Utvid tre" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filter" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Rediger på nettsted" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Last opp ZIP-filer:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Send" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s kommentarer." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s sa på %(comment_submit_date)s
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Ingen kommentarer." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Post kommentar" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Send inn" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Takk!" #~ msgid "Symlinked page" #~ msgstr "Symbolsk linket side" feincms-1.7.4/feincms/locale/nl/000077500000000000000000000000001212255543400164465ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/nl/LC_MESSAGES/000077500000000000000000000000001212255543400202335ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/nl/LC_MESSAGES/django.mo000066400000000000000000000316411212255543400220370ustar00rootroot00000000000000\  `2H$d 9 1(.5< T_Dr  ff&   t(# 45-cs   8  4   %*16L[  #:?DG,1?.qc237kr xGI#;C JVj          %16;AIQW _js x         0< M[mr     $ 1 = JV ]g |   # 8 G T Y \ b m t . _!"*"E"W"Ik"""""M"3#9# >#1K# }##O# # # $!$#4$`X$$$$!$%3% D%Q% c%n%u% {%% & &'& E&P&Y&7j&3&&&& ''#'(9'b'q'' +(C8(|(( (( ((@Z)) ))))* **F,*_s*** ** +++#+O+U+J^++27,9j,6,p,DL-F----H-ME.1... ...// "/ // WY/27G.^B~'`{b jv0pA OVoS\@E!Ry: ?h( ]1dJ9x6P#%DILa5iX %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%s has been moved to a new position.(no caption)Add a brief excerpt summarizing the content of this page.Add child pageAdd new itemAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCannot delete itemCannot delete item, because it is parent of at least one other item.CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create hidden copy of this pageCreate translationDate-based publishingDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordMoveMove toNavigation extensionNew comments may be addedNo comments.Other optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.ParentPost CommentPreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyRelated pagesReplace page %(to_replace)sRich TextSaveSearchSearch engine optimizationSelect pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSymlinked pageTarget URL for automatic redirects.TextThanks!The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You have replaced %s. You may continue editing the now-active page below.You may edit the copied page below.actionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich text (ckeditor)rich textsrich texts (ckeditor)rightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FeinCMS VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2010-09-15 14:29+0200 PO-Revision-Date: 2010-09-15 11:21+0200 Last-Translator: Bjorn Post Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %(comment_username)s zei op %(comment_submit_date)s
    Op %(filter_title)s%(comment_count)s reacties%s is verplaatst.(geen onderschrift)Voeg een korte samenvatting toe die de inhoud van deze pagina beschrijft.Voeg subpagina toeNieuw item toevoegenNaAlleAls dit ingesteld is, dan wordt de inhoud geleverd door de aangegeven pagina.AudioVoorBinaire dataOpload meerdere bestanden tegelijk (zip-bestand):URL uit cacheKan item niet verwijderenKan item niet verwijderen, omdat het de ouder is van een of meerdere sub-items.Categorie%s veranderenTemplate veranderenAlles dichtklappenBevestig om het item te verwijderenInhoud van de ouder-pagina wordt automatisch geërfd. Voeg zelf inhoud toe om dit te veranderen.Maak verborgen kopieMaak vertalingDatum-gebaseerde publiceringBegreep verplaats instructie nietOp de website wijzigenWijzig vertalingSamenvattingAlles openklappenAanbevolenFilterFlashHTML TidyHTML validatie leverde %(count)d waarschuwingen op. Kijk alsjeblieft de bijgewerkte content na voordat je verder gaat: %(messages)sVerbergStartpaginaNegeer de HTML validatie waarschuwingenAfbeeldingVoeg in:Item verwijderd.Leeglaten als het item voor altijd actief moet blijven.Laat dit veld leeg voor bijdragen in de hoofd-taal.Microsoft ExcelMicrosoft PowerPointMicrosoft WordVerplaatsVerplaats naarNavigatie-uitbreidingNieuwe reacties kunnen worden toegevoegdGeen reacties.Overige optiesOverschrijft de URL. Als het een lokale URL betreft moet er aan aan weerszijden een / staan. Dit veld heeft betrekking op zowel de navigatie als de URLs van subpagina's.PDF documentpaginatitel voor het browservenster. Standaard gelijk aan de titel.OuderPlaats ReactieVoorbeeldRSS feedRSS feedsTemplate echt veranderen?
    Alle wijzigingen zijn opgeslagen en de inhoud van %(source_regions)sis verplaatst naar %(target_region)s.Template echt veranderen?
    Alle wijzigingen zijn opgeslagen.Item echt verwijderen?Leeg gebiedGerelateerde pagina'sVervang pagina %(to_replace)sOpgemaakte TekstOpslaanZoekenZoekmachine optimalisatieSelecteer pagina's die beschouwd moet worden als gerelateerd aan deze.Kies de module die subpagina's voor deze pagina definieert als je de navigatie wilt uitbreiden.VerstuurSnelkoppelingenLaat zienStop met WijzigenVerzendenVerbonden paginaEindpunt (URL) voor automatisch doorsturen.TekstBedankt!De eerste regel is de hoofd-titel, de overige regels vormen de ondertitel.Het RSS veld wordt meerdere malen per dag geactualiseerd. Een verandering in de titel zal pas op de pagina verschijnen na de volgende update.Deze URL is al in gebruik door een actieve pagina.Deze URL is al in gebruik door een andere actieve pagina.Dit wordt ook gebruikt voor de gegenereerde navigatie.Dit moet een link naar een youtube of vimeo video zijn. Bijvoorbeeld: http://www.youtube.com/watch?v=zmj1rpzDRZ0Deze beschrijving wordt voor in de standaard beschrijving ingevoegd.Deze begrippen worden voor in de standaard trefwoordenlijst ingevoegd.TitelsVideoOp de website bekijkenWordt automatisch eenmalig ingesteld zodra `gepubliceerd` aangevinkt is.Je hebt %s vervangen. Je kunt de nu actieve pagina hieronder verder wijzigen.Je kunt de gekopieerde pagina hieronder wijzigen.actiesactiefapplicatieapplicatie contentapplicatie contentsBeschikbare vertalingenblokonderschriftcategorieëncategoriereactiescontactformuliercontactformuliereninhoudcontent titelcontent typescopyrightgemaaktgemaakt opdataomschrijvingnaar onderwijzigene-Mailactiefitemsitemsamenvattinguitbreidingenaanbevolenbestandbestandsinformatiebestandsgroottebestandstypebestandenafbeeldingafbeeldingenin navigatiegeërfdis actieftaalLaatste updatelinksLinkMaximaal aantalmedia-bestandMediabestand-vertalingMediabestand-vertalingenmedia-bestandenmeta beschrijvingmeta trefwoordenlaatst gewijzigd opnaamnavigatie-uitbreidingnieuwniet gedeeldvolgordeoverschrijf URLpaginapaginatitelpagina'souderplatpositieVooraf-gerenderde Inhoudgedeeldgepubliceerd opgepubliceerd totgepubliceerdgepubliceerd opRuwe Inhoudruwe inhouddoorsturen naarverwijderenopgemaakte tekstopgemaakte tekst (ckeditor)opgemaakte tekstenopgemaakte teksten (ckeditor)rechtssectiesectiesslugonderwerpverbonden paginatabeltabellentagstemplatetemplate contenttemplate contentsteksttiteltitel rijtitle rij en kolomvertaling vanvertalingentypenaar bovenvideovideo linkvideoszichtbaar van - totfeincms-1.7.4/feincms/locale/nl/LC_MESSAGES/django.po000066400000000000000000000600531212255543400220410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: LANGUAGE \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "template" #: models.py:551 msgid "ordering" msgstr "volgorde" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "taal" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Alle" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Ouder" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Categorie" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "%s veranderen" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "titel" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s is verplaatst." #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "Begreep verplaats instructie niet" #: admin/tree_editor.py:417 msgid "actions" msgstr "acties" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Item echt verwijderen?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "applicatie content" #: content/application/models.py:273 msgid "application contents" msgstr "applicatie contents" #: content/application/models.py:298 msgid "application" msgstr "applicatie" #: content/comments/models.py:24 msgid "enabled" msgstr "actief" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Nieuwe reacties kunnen worden toegevoegd" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "reacties" #: content/comments/models.py:49 msgid "public" msgstr "gedeeld" #: content/comments/models.py:49 msgid "not public" msgstr "niet gedeeld" #: content/contactform/models.py:18 msgid "name" msgstr "naam" #: content/contactform/models.py:19 msgid "email" msgstr "e-Mail" #: content/contactform/models.py:20 msgid "subject" msgstr "onderwerp" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "inhoud" #: content/contactform/models.py:34 msgid "contact form" msgstr "contactformulier" #: content/contactform/models.py:35 msgid "contact forms" msgstr "contactformulieren" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "bestand" #: content/file/models.py:26 msgid "files" msgstr "bestanden" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "afbeelding" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "onderschrift" #: content/image/models.py:53 msgid "images" msgstr "afbeeldingen" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "positie" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(geen onderschrift)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "media-bestand" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "media-bestanden" #: content/medialibrary/models.py:139 msgid "block" msgstr "blok" #: content/medialibrary/models.py:140 msgid "left" msgstr "links" #: content/medialibrary/models.py:141 msgid "right" msgstr "rechts" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "type" #: content/raw/models.py:18 msgid "raw content" msgstr "Ruwe Inhoud" #: content/raw/models.py:19 msgid "raw contents" msgstr "ruwe inhoud" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Negeer de HTML validatie waarschuwingen" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "HTML validatie leverde %(count)d waarschuwingen op. Kijk alsjeblieft de " "bijgewerkte content na voordat je verder gaat: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "tekst" #: content/richtext/models.py:85 msgid "rich text" msgstr "opgemaakte tekst" #: content/richtext/models.py:86 msgid "rich texts" msgstr "opgemaakte teksten" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "Het RSS veld wordt meerdere malen per dag geactualiseerd. Een verandering in " "de titel zal pas op de pagina verschijnen na de volgende update." #: content/rss/models.py:22 msgid "link" msgstr "Link" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "Vooraf-gerenderde Inhoud" #: content/rss/models.py:24 msgid "last updated" msgstr "Laatste update" #: content/rss/models.py:25 msgid "max. items" msgstr "Maximaal aantal" #: content/rss/models.py:29 msgid "RSS feed" msgstr "RSS feed" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "RSS feeds" #: content/section/models.py:41 msgid "section" msgstr "sectie" #: content/section/models.py:42 msgid "sections" msgstr "secties" #: content/table/models.py:66 msgid "plain" msgstr "plat" #: content/table/models.py:67 msgid "title row" msgstr "titel rij" #: content/table/models.py:69 msgid "title row and column" msgstr "title rij en kolom" #: content/table/models.py:75 msgid "table" msgstr "tabel" #: content/table/models.py:76 msgid "tables" msgstr "tabellen" #: content/table/models.py:90 msgid "data" msgstr "data" #: content/template/models.py:51 msgid "template content" msgstr "template content" #: content/template/models.py:52 msgid "template contents" msgstr "template contents" #: content/video/models.py:25 msgid "video link" msgstr "video link" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Dit moet een link naar een youtube of vimeo video zijn. Bijvoorbeeld: http://" "www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "video" #: content/video/models.py:31 msgid "videos" msgstr "videos" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "gepubliceerd" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Dit wordt ook gebruikt voor de gegenereerde navigatie." #: module/blog/models.py:33 msgid "published on" msgstr "gepubliceerd op" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Wordt automatisch eenmalig ingesteld zodra `gepubliceerd` aangevinkt is." #: module/blog/models.py:39 msgid "entry" msgstr "item" #: module/blog/models.py:40 msgid "entries" msgstr "items" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "tags" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "vertaling van" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Laat dit veld leeg voor bijdragen in de hoofd-taal." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "Beschikbare vertalingen" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "gemaakt op" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "laatst gewijzigd op" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "content types" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "gepubliceerd op" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "gepubliceerd tot" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Leeglaten als het item voor altijd actief moet blijven." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "zichtbaar van - tot" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Datum-gebaseerde publicering" #: module/extensions/featured.py:9 msgid "featured" msgstr "aanbevolen" #: module/extensions/featured.py:14 msgid "Featured" msgstr "Aanbevolen" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta trefwoorden" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Deze begrippen worden voor in de standaard trefwoordenlijst ingevoegd." #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta beschrijving" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Deze beschrijving wordt voor in de standaard beschrijving ingevoegd." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Zoekmachine optimalisatie" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Wijzig vertaling" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Maak vertaling" #: module/extensions/translations.py:200 msgid "translations" msgstr "vertalingen" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Voorbeeld" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "bestandsgrootte" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "gemaakt" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "bestandstype" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "bestandsinformatie" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "ouder" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "categorie" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "categorieën" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Afbeelding" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Video" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Audio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "PDF document" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Tekst" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Opgemaakte Tekst" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binaire data" #: module/medialibrary/models.py:236 msgid "description" msgstr "omschrijving" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "Mediabestand-vertaling" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "Mediabestand-vertalingen" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Deze URL is al in gebruik door een actieve pagina." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Deze URL is al in gebruik door een andere actieve pagina." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Overige opties" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "in navigatie" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Voeg subpagina toe" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Op de website bekijken" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "geërfd" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "uitbreidingen" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "is actief" #: module/page/models.py:138 msgid "active" msgstr "actief" #: module/page/models.py:146 msgid "override URL" msgstr "overschrijf URL" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Overschrijft de URL. Als het een lokale URL betreft moet er aan aan " "weerszijden een / staan. Dit veld heeft betrekking op zowel de navigatie " "als de URLs van subpagina's." #: module/page/models.py:148 msgid "redirect to" msgstr "doorsturen naar" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "Eindpunt (URL) voor automatisch doorsturen." #: module/page/models.py:150 msgid "Cached URL" msgstr "URL uit cache" #: module/page/models.py:161 msgid "page" msgstr "pagina" #: module/page/models.py:162 msgid "pages" msgstr "pagina's" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "samenvatting" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" "Voeg een korte samenvatting toe die de inhoud van deze pagina beschrijft." #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Samenvatting" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "navigatie-uitbreiding" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Kies de module die subpagina's voor deze pagina definieert als je de " "navigatie wilt uitbreiden." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "Navigatie-uitbreiding" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Selecteer pagina's die beschouwd moet worden als gerelateerd aan deze." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Gerelateerde pagina's" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "verbonden pagina" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "" "Als dit ingesteld is, dan wordt de inhoud geleverd door de aangegeven pagina." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "content titel" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" "De eerste regel is de hoofd-titel, de overige regels vormen de ondertitel." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "paginatitel" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "paginatitel voor het browservenster. Standaard gelijk aan de titel." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Titels" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr " Op %(filter_title)s" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Zoeken" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Item echt verwijderen?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Bevestig om het item te verwijderen" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Item verwijderd." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Kan item niet verwijderen" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Kan item niet verwijderen, omdat het de ouder is van een of meerdere sub-" "items." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Template veranderen" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Template echt veranderen?
    Alle wijzigingen zijn opgeslagen." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Template echt veranderen?
    Alle wijzigingen zijn opgeslagen en de " "inhoud van %(source_regions)sis verplaatst naar " "%(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Verberg" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Laat zien" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Na" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Voor" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Voeg in:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Leeg gebied" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Inhoud van de ouder-pagina wordt automatisch geërfd. Voeg zelf inhoud toe om " "dit te veranderen." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Nieuw item toevoegen" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Opslaan" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Stop met Wijzigen" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "wijzigen" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nieuw" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "naar boven" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "naar onder" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "verwijderen" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Startpagina" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Snelkoppelingen" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Alles dichtklappen" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Alles openklappen" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filter" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Op de website wijzigen" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Opload meerdere bestanden tegelijk (zip-bestand):" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Verstuur" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s reacties" #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s zei op %(comment_submit_date)s
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Geen reacties." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Plaats Reactie" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Verzenden" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Bedankt!" #~ msgid "Symlinked page" #~ msgstr "Verbonden pagina" feincms-1.7.4/feincms/locale/pl/000077500000000000000000000000001212255543400164505ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/pl/LC_MESSAGES/000077500000000000000000000000001212255543400202355ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/pl/LC_MESSAGES/django.po000066400000000000000000000560171212255543400220500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: msmenzyk \n" "Language-Team: LANGUAGE \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "szablon" #: models.py:551 msgid "ordering" msgstr "sortowanie" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "język" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "wszystko" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Rodzic" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Kategoria" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Zmień %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "tytuł" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s został przesunięty" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "Instrukcja przesunięcia nie jest zrozumiała." #: admin/tree_editor.py:417 msgid "actions" msgstr "akcje" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Usunąć?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "zawartość aplikacji" #: content/application/models.py:273 msgid "application contents" msgstr "application content" #: content/application/models.py:298 msgid "application" msgstr "aplikacja" #: content/comments/models.py:24 msgid "enabled" msgstr "aktywny" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Nowe komentarze mogą być dodane" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "komentarze" #: content/comments/models.py:49 msgid "public" msgstr "publiczne" #: content/comments/models.py:49 msgid "not public" msgstr "nie publiczne" #: content/contactform/models.py:18 msgid "name" msgstr "nazwa" #: content/contactform/models.py:19 msgid "email" msgstr "email" #: content/contactform/models.py:20 msgid "subject" msgstr "temat" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "zawartość" #: content/contactform/models.py:34 msgid "contact form" msgstr "formularz kontaktowy" #: content/contactform/models.py:35 msgid "contact forms" msgstr "formularze kontaktowe" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "plik" #: content/file/models.py:26 msgid "files" msgstr "pliki" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "zdjęcie" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "" #: content/image/models.py:53 msgid "images" msgstr "zdjęcia" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "pozycja" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(brak napisu)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "plik media" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "pliki media" #: content/medialibrary/models.py:139 msgid "block" msgstr "block" #: content/medialibrary/models.py:140 msgid "left" msgstr "lewa" #: content/medialibrary/models.py:141 msgid "right" msgstr "prawa" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "typ" #: content/raw/models.py:18 msgid "raw content" msgstr "tekst niesformatowany" #: content/raw/models.py:19 msgid "raw contents" msgstr "teksty niesformatowane" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Ignoruj ostrzeżenia o walidacji HMTL" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "tekst" #: content/richtext/models.py:85 msgid "rich text" msgstr "Obszar tekstowy (WYSIWYG)" #: content/richtext/models.py:86 msgid "rich texts" msgstr "Obszary tekstowe (WYSIWYG)" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" #: content/rss/models.py:22 msgid "link" msgstr "link" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "" #: content/rss/models.py:24 msgid "last updated" msgstr "ostatnio aktualizowany" #: content/rss/models.py:25 msgid "max. items" msgstr "maksymalna ilość" #: content/rss/models.py:29 msgid "RSS feed" msgstr "kanał RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "kanały RSS" #: content/section/models.py:41 msgid "section" msgstr "sekcja" #: content/section/models.py:42 msgid "sections" msgstr "sekcje" #: content/table/models.py:66 msgid "plain" msgstr "zwyczajny" #: content/table/models.py:67 msgid "title row" msgstr "tytuł" #: content/table/models.py:69 msgid "title row and column" msgstr "" #: content/table/models.py:75 msgid "table" msgstr "tablica" #: content/table/models.py:76 msgid "tables" msgstr "tablice" #: content/table/models.py:90 msgid "data" msgstr "data" #: content/template/models.py:51 msgid "template content" msgstr "tekst szablonu" #: content/template/models.py:52 msgid "template contents" msgstr "teksty szablonów" #: content/video/models.py:25 msgid "video link" msgstr "link video" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Umieść link do youtube.com lub vimeo.com, np. http://www.youtube.com/watch?" "v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "video" #: content/video/models.py:31 msgid "videos" msgstr "video" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "opublikowany" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "" #: module/blog/models.py:33 msgid "published on" msgstr "opublikowany na" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Zostanie automatycznie ustawione po kliknięciu \"opublikowany\" powyżej" #: module/blog/models.py:39 msgid "entry" msgstr "wpis" #: module/blog/models.py:40 msgid "entries" msgstr "wpisy" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "tagi" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "tłumaczenie" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "dostępne tłumaczenia" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "data utworzenia" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "data modyfikacji" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "typ treści" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "data publikacji" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "końcowa data publikacji" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Pozostaw puste jeśli nie chcesz określać końcowej daty publikacji" #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "widoczne od - do" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Określanie okresu publikacji" #: module/extensions/featured.py:9 msgid "featured" msgstr "" #: module/extensions/featured.py:14 msgid "Featured" msgstr "" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "tagi meta - keywords" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Zostanie dołączone z przodu listy tagów" #: module/extensions/seo.py:11 msgid "meta description" msgstr "tagi meta - description" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Zostanie dołączone z przodu listy tagów" #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Pola SEO " #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Edytuj tłumaczenie" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Stwórz tłumaczenie" #: module/extensions/translations.py:200 msgid "translations" msgstr "tłumaczenia" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "Dodaj zaznaczone pliki do kategorii" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Podgląd" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "rozmiar pliku" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "utworzony" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "typ pliku" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "informacje o pliku" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "zaimportowano %d plików" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "Brak wybranego pliku " #: module/medialibrary/models.py:43 msgid "parent" msgstr "rodzic" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug (wyświetlany adres)" #: module/medialibrary/models.py:49 msgid "category" msgstr "kategoria" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "kategorie" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Zdjęcie" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Video" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Audio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "Dokument PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Tekst" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Obszar tekstowy (WYSIWYG)" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "Archiwum ZIP" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binarny" #: module/medialibrary/models.py:236 msgid "description" msgstr "opis" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "ten URL jest już używany przez aktywną stronę." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "ten URL jest już używany przez inną aktywną stronę." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Pozostałe opcje" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "W menu" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Dodaj podstronę" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Zobacz podgląd strony" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "Nie masz wystarczających uprawnień aby edytować ten element" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "dziedziczone" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "rozszerzenia" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "czy jest aktywne" #: module/page/models.py:138 msgid "active" msgstr "aktywny" #: module/page/models.py:146 msgid "override URL" msgstr "nadpisz URL" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" #: module/page/models.py:148 msgid "redirect to" msgstr "przekieruj do" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL do automatycznych przekierowań" #: module/page/models.py:150 msgid "Cached URL" msgstr "" #: module/page/models.py:161 msgid "page" msgstr "strona" #: module/page/models.py:162 msgid "pages" msgstr "strony" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Powiązane strony" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "Strony" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "dowiązana strona" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "" #: module/page/extensions/titles.py:13 msgid "content title" msgstr "Tytuł treści" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" #: module/page/extensions/titles.py:15 msgid "page title" msgstr "Tytuł strony" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Tytuły" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "Po %(filter_title)s " #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Szukaj" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Usunąć?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Potwierdź usunięcie" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Element został usunięty" #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Brak możliwości usunięcia elementu" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Element nie może zostać usunięty ponieważ zawiera przynajmniej jeden element " "podrzędny. Usuń wpierw elementy podrzędne." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Zmień szablon" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Zmienić szablon?
    Wszystkie zmiany zostały zachowane." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Zmienić szablon?
    Wszystkie zmiany zostały zachowane, treść z " "%(source_regions)s została przeniesiona do " "%(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Ukryj" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Pokaż" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Za" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Przed" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Wstaw nowy:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Pusty region" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Treść ze strony nadrzędnej został automatycznie odziedziczony. Wstaw treść " "aby nadpisać odziedziczoną wartość." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Dodaj nowy element" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "Dodaj następny %(verbose_name)s" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "Usuń" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Zachowaj" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Zakończ Edycję" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "edytuj" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nowy" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "góra" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "dół" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "usuń" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Główna" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "Historia" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Zwiń drzewo" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Rozwiń drzewo" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtruj" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Edytuj na stronie" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "Dodaj" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "Dodaj pliki media do kategorii" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "Wybierz kategorię:" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "Następujące pliki media zostaną dodane do wybranej kategorii:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "Dodaj do kategorii" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "Anuluj" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Wyślij" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "" #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" #: templates/content/comments/default.html:28 msgid "No comments." msgstr "" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Wyślij" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Dziękuję!" #~ msgid "Symlinked page" #~ msgstr "Dowiazana strona" feincms-1.7.4/feincms/locale/pt/000077500000000000000000000000001212255543400164605ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/pt/LC_MESSAGES/000077500000000000000000000000001212255543400202455ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/pt/LC_MESSAGES/django.mo000066400000000000000000000367731212255543400220640ustar00rootroot000000000000003`J`|$ 9* F$Sx1 DaZ  fk~&  '*3: @tJ# 4"5W    8 B"De 4^     36M[  r #TDAb,*1W.c2 3O )   G <!L!g!! !!!! !!!! "" "$"-" 6" C"Q" Y" g" u"" "" """""""" """ " " # #### %# 3# =#G# P#]#b# g# r#}## ## ####$ $$ $($ -$8$>$E$K$T$i$p$$ $ $ $ $ $$ $ $$$$% %%!%'%.%3%<%M%_%d% j%t%% %%%% %%%%aq'''(% ( F( T(?^( ((,( )=)\)s)y)%))))) )))B*|H* * ***+H+g+x++,++++,A, Y,e,m, s,},- --($-M- T-b-<~-;--..+.(D.m.!... G/ T/Kb/ //K/O0 h0s0|00OC1 1$1 1112 2*222!;2!]282c23#3+33383H3O33343)4 /4L94K4P4#51575@6tZ616=7#?7c7l7 s7Y7@7)8D8)c8 8888 888899 "9 -9 79D9\9 u999 9 999 9 999 9: :: : ':3:<:U:i: z:::::::::: :::";#2;V;l;};;;;; ; ; ;;; < < < (<2<M<V< k< y< < <<<< < <<< <<= === '=1=8=L=c=i=q== = == =====QJodc?5B8%j<em}t$)L2G-@\Y"MaZ^_63x:O~F=]`z7h iEn{RHKsu/WDk Irbp9.,S+!A[l0*X&NUwg(;P vyVT|C'1#f q 4> %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%d files imported%s has been moved to a new position.(no caption)AddAdd a brief excerpt summarizing the content of this page.Add another %(verbose_name)sAdd child pageAdd media files to categoryAdd new itemAdd selected media files to categoryAdd to categoryAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCancelCannot delete itemCannot delete item, because it is parent of at least one other item.Cannot overwrite with different file type (attempt to overwrite a %(old_ext)s with a %(new_ext)s)CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create translationDate-based publishingDescription of imageDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeExport selected media files as zip fileFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHistoryHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.OverwritePDF documentPage title for browser window. Same as title by default.ParentPost CommentPress the save button below to recover this version of the object.Press the save button below to revert to this version of the object.PreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Recover deleted %(verbose_name)sRegion emptyRelated pagesRemoveRevert %(verbose_name)sRich TextSaveSearchSearch engine optimizationSelect category to apply:Select pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowSiteStop EditingSubmitSuccessfully added %(count)d media file to %(category)s.Successfully added %(count)d media files to %(category)s.Symlinked pageTaggingTarget URL for automatic redirects.TextThanks!The content from the original translation has been copied to the newly created page.The first line is the main title, the following lines are subtitles.The following media files will be added to the selected category:The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.This would create a loop in the hierarchyTitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You don't have the necessary permissions to edit this objectZIP file export failed: %sZIP file exported as %sZIP import failed: %sZip archiveactionsactivealternate textapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesformatimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textsrightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FeinCMS Report-Msgid-Bugs-To: http://github.com/feincms/feincms/issues POT-Creation-Date: 2012-03-09 16:47+0100 PO-Revision-Date: 2012-06-30 21:51+0000 Last-Translator: Vítor Figueiró Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: pt Plural-Forms: nplurals=2; plural=(n != 1) %(comment_username)s disse em %(comment_submit_date)s
    Por %(filter_title)s%(comment_count)s comentários.%d ficheiros importados%s foi movido para uma nova posição(sem legenda)AdicionarAdicione um breve excerto que resuma o conteúdo desta página.Adicionar outro %(verbose_name)sAdicionar página descendenteAdicionar ficheiros multimédia à categoriaAdicionar novo itemAdicionar os ficheiros multimédia seleccionados à categoriaAdicionar à categoriaApósTodosO conteúdo é herdado desta página.ÁudioAntesBinárioEnviar um ficheiro ZIP:URL em cacheCancelarImpossível eliminar o itemImpossível eliminar o item, pois possui pelo menos um dependente.Não é possível sobrescrever com um tipo de ficheiro diferente (tentativa de substituir um %(old_ext)s com um %(new_ext)s)CategoriaModificar %sAlterar o modeloColapsar a árvoreConfirme para eliminar o itemO conteúdo é herdado da página ascendente, excepto se o indicar aqui.Criar traduçãoPublicação baseada em datasDescrição da imagemA instrução para mover não foi entendida.Editar no siteEditar a traduçãoExcertoExpandir a árvoreExportar os ficheiros multimédia seleccionados como ficheiro zipEm destaqueFiltrarFlashHTML TidyA validação do HTML produziu %(count)d avisos. Por favor reveja o conteúdo actualizado em baixo antes de continuar: %(messages)s OcultarHistorialPágina inicialIgnorar os avisos de validação do HTMLImagemInserir novo:Item eliminado com sucesso.Deixe vazio se a entrada deve permanecer activa para sempre.Deixe este campo em branco nas entradas no idioma original.Microsoft ExcelMicrosoft PowerPointMicrosoft WordExtensão de navegaçãoPodem ser adicionados novos comentáriosNenhum comentário.Não indicou o ficheiro de origemoutras opçõesURL efectivo. Deve conter uma / no início e no fim, caso se trate de um URL local. Este campo determina a navegação e os URL's das sub-páginas.SobrescreverDocumento PDFTítulo da página para a janela do navegador. Se omitido assume o título.AscendenteEnviar ComentárioClique no botão 'Guardar' em baixo para recuperar esta versão do objecto.Clique no botão 'Guardar' em baixo para reverter para esta versão do objecto.Antevisãofeed RSSfeed RSSConfirma que deseja alterar o modelo?
    Todas as alterações serão guardadas e o conteúdo de %(source_regions)s será movido para %(target_region)s.Confirma a alteração do modelo?
    Todas as alterações serão guardadas.Confirma a eliminação do item?Recuperar %(verbose_name)s excluídoRegião vaziaPáginas relacionadasRemoverReverter %(verbose_name)sTexto RicoGuardarProcurarOptimização para motor de buscaSeleccione a categoria a aplicar:Seleccione páginas a listar como conteúdo relacionado.Seleccione o módulo que providencia as sub-páginas, caso necessite de personalizar a navegação.EnviarAtalhosMostrarSiteParar de EditarEnviar%(count)d ficheiro multimédia adicionado com sucesso a %(category)s.%(count)d ficheiros multimédia adicionados com sucesso a %(category)s.Página ligadaTaggingURL de destino para redireccionamentos automáticos.TextoObrigado!O conteúdo da tradução original foi copiado para a página recém-criada.A primeira linha é o título principal. Outras linhas serão sub-títulos.Os seguintes ficheiros multimédia serão adicionados à categoria seleccionada:O feed RSS é actualizado várias vezes ao dia. Uma alteração do título só aparece no site após a actualização do feed RSS seguinte.Este URL já está tomado por uma página activa.Este URL já está tomado por uma outra página activa.Isto também é usado para a navegação gerada automaticamente.Isto deve ser uma ligação para um vídeo do Youtube ou do vimeo, p.ex.: http://www.youtube.com/watch?v=zmj1rpzDRZ0Isto será inserido antes da descrição padrão.Isto será inserido antes da lista de palavras-chave padrão.Isto criaria um ciclo na hierarquiaTítulosVídeoVer no siteSerá definido automaticamente quando activar a caixa de verificação 'publicado' acima.Não possui as permissões necessárias para editar este objectoA exportação do ficheiro ZIP falhou: %sFicheiro ZIP exportado como %sA importação do ficheiro ZIP falhou: %sFicheiro zipacçõesactivotexto alternativoaplicaçãoconteúdo de aplicaçãoconteúdos de aplicaçãotraduções disponíveisblocolegendacategoriascategoriacomentáriosformulário de contactoformulários de contactoconteúdotítulo do conteúdotipos de conteúdocopyrightcriado emdata de criaçãodadosdescriçãopara baixoeditare-mailhabilitadoentradasentradaexcertoextensõesem destaqueficheiroinformação do ficheirotamanho do ficheirotipo de ficheiroficheirosformatoimagemimagensna navegaçãoherdadoactivoidiomaúltima actualizaçãoesquerdaligaçãonúmero máximoficheiro multimédiatradução do ficheiro multimédiatraduções do ficheiro multimédiaficheiros multimédiadescrição metapalavras-chave metadata de modificaçãonomeextensão de navegaçãonovonão públicoordenaçãoURL efectivopáginatítulo da páginapáginasascendentesimplesposiçãoconteúdo pré-renderizadopúblicodata de publicaçãopublicar atépublicadopublicado emconteúdo cruconteúdos crusredireccionar pararemovertexto ricotextos ricosdireitasecçãosecçõesslugassuntopágina ligadatabelatabelasetiquetasmodeloconteúdo do modeloconteúdos de templatetextotítulolinha de títulolinha e coluna de títulotradução detraduçõestipopara cimavídeoligação de vídeovídeosvisível de - atéfeincms-1.7.4/feincms/locale/pt/LC_MESSAGES/django.po000066400000000000000000000630221212255543400220520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-30 21:51+0000\n" "Last-Translator: Vítor Figueiró \n" "Language-Team: LANGUAGE \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "modelo" #: models.py:551 msgid "ordering" msgstr "ordenação" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "idioma" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Todos" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Ascendente" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Categoria" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Modificar %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "título" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s foi movido para uma nova posição" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "A instrução para mover não foi entendida." #: admin/tree_editor.py:417 msgid "actions" msgstr "acções" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Confirma a eliminação do item?" #: admin/tree_editor.py:437 #, fuzzy, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "Recuperar %(verbose_name)s excluído" #: content/application/models.py:272 msgid "application content" msgstr "conteúdo de aplicação" #: content/application/models.py:273 msgid "application contents" msgstr "conteúdos de aplicação" #: content/application/models.py:298 msgid "application" msgstr "aplicação" #: content/comments/models.py:24 msgid "enabled" msgstr "habilitado" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Podem ser adicionados novos comentários" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "comentários" #: content/comments/models.py:49 msgid "public" msgstr "público" #: content/comments/models.py:49 msgid "not public" msgstr "não público" #: content/contactform/models.py:18 msgid "name" msgstr "nome" #: content/contactform/models.py:19 msgid "email" msgstr "e-mail" #: content/contactform/models.py:20 msgid "subject" msgstr "assunto" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "conteúdo" #: content/contactform/models.py:34 msgid "contact form" msgstr "formulário de contacto" #: content/contactform/models.py:35 msgid "contact forms" msgstr "formulários de contacto" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "ficheiro" #: content/file/models.py:26 msgid "files" msgstr "ficheiros" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "imagem" #: content/image/models.py:46 msgid "alternate text" msgstr "texto alternativo" #: content/image/models.py:47 msgid "Description of image" msgstr "Descrição da imagem" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "legenda" #: content/image/models.py:53 msgid "images" msgstr "imagens" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "posição" #: content/image/models.py:87 msgid "format" msgstr "formato" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(sem legenda)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "ficheiro multimédia" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "ficheiros multimédia" #: content/medialibrary/models.py:139 msgid "block" msgstr "bloco" #: content/medialibrary/models.py:140 msgid "left" msgstr "esquerda" #: content/medialibrary/models.py:141 msgid "right" msgstr "direita" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "tipo" #: content/raw/models.py:18 msgid "raw content" msgstr "conteúdo cru" #: content/raw/models.py:19 msgid "raw contents" msgstr "conteúdos crus" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Ignorar os avisos de validação do HTML" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "A validação do HTML produziu %(count)d avisos. Por favor reveja o conteúdo " "actualizado em baixo antes de continuar: %(messages)s " #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "texto" #: content/richtext/models.py:85 msgid "rich text" msgstr "texto rico" #: content/richtext/models.py:86 msgid "rich texts" msgstr "textos ricos" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "O feed RSS é actualizado várias vezes ao dia. Uma alteração do título só " "aparece no site após a actualização do feed RSS seguinte." #: content/rss/models.py:22 msgid "link" msgstr "ligação" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "conteúdo pré-renderizado" #: content/rss/models.py:24 msgid "last updated" msgstr "última actualização" #: content/rss/models.py:25 msgid "max. items" msgstr "número máximo" #: content/rss/models.py:29 msgid "RSS feed" msgstr "feed RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "feed RSS" #: content/section/models.py:41 msgid "section" msgstr "secção" #: content/section/models.py:42 msgid "sections" msgstr "secções" #: content/table/models.py:66 msgid "plain" msgstr "simples" #: content/table/models.py:67 msgid "title row" msgstr "linha de título" #: content/table/models.py:69 msgid "title row and column" msgstr "linha e coluna de título" #: content/table/models.py:75 msgid "table" msgstr "tabela" #: content/table/models.py:76 msgid "tables" msgstr "tabelas" #: content/table/models.py:90 msgid "data" msgstr "dados" #: content/template/models.py:51 msgid "template content" msgstr "conteúdo do modelo" #: content/template/models.py:52 msgid "template contents" msgstr "conteúdos de template" #: content/video/models.py:25 msgid "video link" msgstr "ligação de vídeo" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Isto deve ser uma ligação para um vídeo do Youtube ou do vimeo, p.ex.: " "http://www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "vídeo" #: content/video/models.py:31 msgid "videos" msgstr "vídeos" #: contrib/tagging.py:117 msgid "Tagging" msgstr "Tagging" #: module/blog/models.py:28 msgid "published" msgstr "publicado" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Isto também é usado para a navegação gerada automaticamente." #: module/blog/models.py:33 msgid "published on" msgstr "publicado em" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Será definido automaticamente quando activar a caixa de verificação " "'publicado' acima." #: module/blog/models.py:39 msgid "entry" msgstr "entrada" #: module/blog/models.py:40 msgid "entries" msgstr "entradas" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "etiquetas" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "tradução de" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Deixe este campo em branco nas entradas no idioma original." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "traduções disponíveis" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "data de criação" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "data de modificação" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "tipos de conteúdo" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "data de publicação" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "publicar até" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Deixe vazio se a entrada deve permanecer activa para sempre." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "visível de - até" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Publicação baseada em datas" #: module/extensions/featured.py:9 msgid "featured" msgstr "em destaque" #: module/extensions/featured.py:14 msgid "Featured" msgstr "Em destaque" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "palavras-chave meta" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Isto será inserido antes da lista de palavras-chave padrão." #: module/extensions/seo.py:11 msgid "meta description" msgstr "descrição meta" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Isto será inserido antes da descrição padrão." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Optimização para motor de busca" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Editar a tradução" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Criar tradução" #: module/extensions/translations.py:200 msgid "translations" msgstr "traduções" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "Isto criaria um ciclo na hierarquia" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" "Não é possível sobrescrever com um tipo de ficheiro diferente (tentativa de " "substituir um %(old_ext)s com um %(new_ext)s)" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" "%(count)d ficheiro multimédia adicionado com sucesso a %(category)s." msgstr[1] "" "%(count)d ficheiros multimédia adicionados com sucesso a %(category)s." #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "Adicionar os ficheiros multimédia seleccionados à categoria" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "Ficheiro ZIP exportado como %s" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "A exportação do ficheiro ZIP falhou: %s" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "Exportar os ficheiros multimédia seleccionados como ficheiro zip" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Antevisão" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "tamanho do ficheiro" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "criado em" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "tipo de ficheiro" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "informação do ficheiro" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "%d ficheiros importados" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "A importação do ficheiro ZIP falhou: %s" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "Não indicou o ficheiro de origem" #: module/medialibrary/models.py:43 msgid "parent" msgstr "ascendente" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "categoria" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "categorias" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Imagem" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Vídeo" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Áudio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "Documento PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Texto" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Texto Rico" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "Ficheiro zip" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binário" #: module/medialibrary/models.py:236 msgid "description" msgstr "descrição" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "tradução do ficheiro multimédia" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "traduções do ficheiro multimédia" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Este URL já está tomado por uma página activa." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Este URL já está tomado por uma outra página activa." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "outras opções" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "na navegação" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Adicionar página descendente" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Ver no site" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" "O conteúdo da tradução original foi copiado para a página recém-criada." #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "Não possui as permissões necessárias para editar este objecto" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "herdado" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "extensões" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "activo" #: module/page/models.py:138 msgid "active" msgstr "activo" #: module/page/models.py:146 msgid "override URL" msgstr "URL efectivo" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "URL efectivo. Deve conter uma / no início e no fim, caso se trate de um URL " "local. Este campo determina a navegação e os URL's das sub-páginas." #: module/page/models.py:148 msgid "redirect to" msgstr "redireccionar para" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL de destino para redireccionamentos automáticos." #: module/page/models.py:150 msgid "Cached URL" msgstr "URL em cache" #: module/page/models.py:161 msgid "page" msgstr "página" #: module/page/models.py:162 msgid "pages" msgstr "páginas" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "excerto" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "Adicione um breve excerto que resuma o conteúdo desta página." #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Excerto" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "extensão de navegação" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Seleccione o módulo que providencia as sub-páginas, caso necessite de " "personalizar a navegação." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "Extensão de navegação" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Seleccione páginas a listar como conteúdo relacionado." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Páginas relacionadas" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "Site" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "página ligada" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "O conteúdo é herdado desta página." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "título do conteúdo" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" "A primeira linha é o título principal. Outras linhas serão sub-títulos." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "título da página" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Título da página para a janela do navegador. Se omitido assume o título." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Títulos" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "Por %(filter_title)s" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Procurar" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Confirma a eliminação do item?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Confirme para eliminar o item" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Item eliminado com sucesso." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Impossível eliminar o item" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "Impossível eliminar o item, pois possui pelo menos um dependente." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Alterar o modelo" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "" "Confirma a alteração do modelo?
    Todas as alterações serão guardadas." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Confirma que deseja alterar o modelo?
    Todas as alterações serão " "guardadas e o conteúdo de %(source_regions)s será movido " "para %(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Ocultar" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Mostrar" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Após" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Antes" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Inserir novo:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Região vazia" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "O conteúdo é herdado da página ascendente, excepto se o indicar aqui." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Adicionar novo item" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "Adicionar outro %(verbose_name)s" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "Remover" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Guardar" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Parar de Editar" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "editar" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "novo" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "para cima" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "para baixo" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "remover" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Página inicial" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "Recuperar %(verbose_name)s excluído" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" "Clique no botão 'Guardar' em baixo para recuperar esta versão do objecto." #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "Historial" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "Reverter %(verbose_name)s" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" "Clique no botão 'Guardar' em baixo para reverter para esta versão do objecto." #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Atalhos" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Colapsar a árvore" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Expandir a árvore" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtrar" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Editar no site" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "Adicionar" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "Adicionar ficheiros multimédia à categoria" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "Seleccione a categoria a aplicar:" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" "Os seguintes ficheiros multimédia serão adicionados à categoria seleccionada:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "Adicionar à categoria" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "Cancelar" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Enviar um ficheiro ZIP:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "Sobrescrever" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Enviar" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s comentários." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s disse em " "%(comment_submit_date)s
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Nenhum comentário." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Enviar Comentário" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Enviar" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Obrigado!" #~ msgid "Symlinked page" #~ msgstr "Página ligada" feincms-1.7.4/feincms/locale/pt/LC_MESSAGES/djangojs.mo000066400000000000000000000006641212255543400224070ustar00rootroot00000000000000,<PQUVHideProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2010-02-10 01:20+0000 PO-Revision-Date: 2010-02-10 01:23 Last-Translator: Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Translated-Using: django-rosetta 0.5.1 Ocultarfeincms-1.7.4/feincms/locale/pt/LC_MESSAGES/djangojs.po000066400000000000000000000012231212255543400224020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-10 01:20+0000\n" "PO-Revision-Date: 2010-02-10 01:23\n" "Last-Translator: \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Translated-Using: django-rosetta 0.5.1\n" #: media/feincms/item_editor.js:16 msgid "Hide" msgstr "Ocultar" feincms-1.7.4/feincms/locale/pt_BR/000077500000000000000000000000001212255543400170435ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001212255543400206305ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/pt_BR/LC_MESSAGES/django.mo000066400000000000000000000336031212255543400224340ustar00rootroot00000000000000 ``a$  &93m |1 D9T  f=]p&   t # 45FVkz   p8}  4~   766n[  ")#8\a`iD,1.c#23 GxPI#7? FRf{        !-27=EMS [fo t ~       " . ? M _ d y }           ! ! #! /! 7 C7M7T7h7p7%8pXolC7/I0Dz>[)G ! O4Sg|TJKWthU`5vu{69Rs~e=w@q^b&Q c:B?$-;#km Px"y32 <Ar'da] \}YZFM+EVjH,fLn_.(i1*N %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%s has been moved to a new position.(no caption)Add %(name)sAdd a brief excerpt summarizing the content of this page.Add child pageAdd new itemAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCannot delete itemCannot delete item, because it is parent of at least one other item.Cannot remove this frame while inside this admin section.CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create hidden copy of this pageCreate translationDate-based publishingDeleteDid not understand moving instruction.EditEdit on siteEdit translationExcerptExpand treeFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordMoveMove toNavigation extensionNew comments may be addedNo comments.Other optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.ParentPost CommentPreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyRelated pagesReloadReplace page %(to_replace)sRich TextSaveSearchSearch engine optimizationSelect an item on the left side if you want to edit it.Select pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSymlinked pageTarget URL for automatic redirects.TextThanks!The context menu on the tree root and tree nodes provide you with additional modes of operation.The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You can change the structure of the tree by drag-dropping elements. Please note that changes will be saved immediately. You have replaced %s. You may continue editing the now-active page below.You may edit the copied page below.actionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedlanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich text (ckeditor)rich textsrich texts (ckeditor)rightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FienCMS Report-Msgid-Bugs-To: POT-Creation-Date: 2010-09-15 22:56+0100 PO-Revision-Date: 2010-09-15 23:34+0100 Last-Translator: Vítor Figueiró Language-Team: pt-BR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Portuguese X-Poedit-Country: BRAZIL X-Poedit-SourceCharset: utf-8 %(comment_username)s disse em %(comment_submit_date)s
    Por %(filter_title)s %(comment_count)s comentários.%s foi movido para uma nova posição(sem legenda)Adicionar %(name)sAdicione um breve excerto que sumarize o conteúdo desta página.Adicionar página descendenteAdicionar novo itemApósTodosO conteúdo é herdado desta página.ÁudioAntesBinárioEnviar um arquivo ZIP:URL em cacheImpossível eliminar o itemImpossível eliminar o item, pois possui pelo menos um dependente.É impossível remover esta moldura enquanto estiver dentro desta secção de admin.CategoriaModificar %sAlterar o modeloColapsar a árvoreConfirme para eliminar o itemO conteúdo é herdado da página ascendente, excepto se o indicar aqui.Criar uma cópia oculta desta páginaCriar traduçãoPublicação baseada em datasEliminarA instrução para mover não foi entendida.EditarEditar no sítioEditar a traduçãoExcertoExpandir a árvoreRecomendadoFiltrarFlashHTML TidyA validação HTML produziu %(count)d avisos. Por favor reveja o conteúdo atualizado em baixo antes de continuar: %(messages)sOcultarPágina inicialIgnorar os avisos de validação HTMLImagemInserir novo:Item eliminado com sucesso.Deixe em branco se a entrada deve ficar ativa para sempre.Deixe este campo em branco nas entradas do idioma original.Microsoft ExcelMicrosoft PowerPointMicrosoft WordMoverMover paraExtensão de navegaçãoPodem ser adicionados novos comentáriosNão há comentários.outras opçõesURL efetivo. Deve conter uma /, caso se trate de um URL local. Este campo determina a navegação e os URL's das sub-páginas.documento PDFTítulo da página para a janela do navegador. Se omitido assume o título.AscendenteEnviar ComentárioPré-visualizaçãofeed RSSfeeds RSSConfirma a alteração do modelo?
    As modificações serão gravadas e o conteúdo de %(source_regions)s será movido para %(target_region)s.Confirma a alteração do modelo?
    Todas as alterações serão guardadas.Confirma a eliminação do item?Região vaziaPáginas relacionadasRecarregarSubstituir a página %(to_replace)sTexto RicoGuardarProcurarOtimização para motor de buscaSelecione um item à esquerda para o editar.Selecione páginas a listar como conteúdo relacionado.Selecione o módulo que providencia sub-páginas.EnviarAtalhosMostrarParar de EditarEnviarPágina ligadaURL de destino para redirecionamentos automáticos.TextoObrigado!O menu de contexto na raiz e nos ramos da árvore permite modos de operação adicionais.A primeira linha é o título principal. Outras linhas serão sub-títulos.O feed RSS é atualizado várias vezes por dia. Uma alteração do título só aparece no site após a atualização de feed RSS seguinte.Este URL já está ocupado por uma página ativa.Este URL já está ocupado por outra página ativa.Isto também é usado para a navegação gerada automaticamente.Isto deve ser uma ligação para um vídeo do Youtube ou do vimeo, p.ex.: http://www.youtube.com/watch?v=zmj1rpzDRZ0Isto será inserido antes da descrição padrão.Isto será inserido antes da lista de palavras-chave padrão.TítulosVídeoVer no siteÉ definido automaticamente quando ativa a caixa de verificação 'publicado' acima.Pode alterar a estrutura da árvore arrastando elementos. Note que as alterações serão guardadas imediatamente.Substituiu %s. Pode continuar a editar a página em baixo, agora ativa.Pode voltar a editar a página copiada em baixo.açõesativoaplicaçãoconteúdo de aplicaçãoconteúdos de aplicaçãotraduções disponíveisblocolegendacategoriascategoriacomentáriosformulário de contatoformulários de contatoconteúdotítulo do conteúdotipos de conteúdocopyrightcriado emdata de criaçãodadosdescriçãopara baixoeditare-mailhabilitadoentradasentradaexcertoextensõesrecomendadoarquivoinformação do arquivotamanho do arquivotipo de arquivoarquivosimagemimagensna navegaçãoherdadoidiomaúltima atualizaçãoesquerdaligaçãonúmero máximoarquivo de mídiatradução do arquivo de mídiatraduções do arquivo de mídiaarquivos de mídiadescrição metapalavras-chave metadata de modificaçãonomeextensão de navegaçãonovonão públicoordemURL efetivopáginatítulo da páginapáginasascendentesimplesposiçãoconteúdo pré-renderizadopúblicodata de publicaçãopublicar atépublicadopublicado emconteúdo cruconteúdos crusredirecionar pararemovertexto ricotexto rico (ckeditor)textos ricostextos ricos (ckeditor)direitasecçãosecçõesslugassuntopágina ligadatabelatabelasetiquetasmodeloconteúdo de modeloconteúdos de modelotextotítulotítulo da linhalinha e coluna de títulotradução detraduçõestipopara cimavídeoligação de vídeovídeosvisível de - atéfeincms-1.7.4/feincms/locale/pt_BR/LC_MESSAGES/django.po000066400000000000000000000622021212255543400224340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Guilherme Gondim , 2012. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Guilherme Gondim \n" "Language-Team: LANGUAGE \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "modelo" #: models.py:551 msgid "ordering" msgstr "ordenação" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "idioma" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Todos" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Ascendente" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Categoria" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Modificar %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "título" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s foi movido para uma nova posição." #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "A instrução para mover não foi entendida." #: admin/tree_editor.py:417 msgid "actions" msgstr "ações" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Confirma a remoção do item?" #: admin/tree_editor.py:437 #, fuzzy, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "Recuperar %(verbose_name)s removido" #: content/application/models.py:272 msgid "application content" msgstr "conteúdo de aplicação" #: content/application/models.py:273 msgid "application contents" msgstr "conteúdos de aplicação" #: content/application/models.py:298 msgid "application" msgstr "aplicação" #: content/comments/models.py:24 msgid "enabled" msgstr "habilitado" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "Podem ser adicionados novos comentários" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "comentários" #: content/comments/models.py:49 msgid "public" msgstr "público" #: content/comments/models.py:49 msgid "not public" msgstr "não público" #: content/contactform/models.py:18 msgid "name" msgstr "nome" #: content/contactform/models.py:19 msgid "email" msgstr "e-mail" #: content/contactform/models.py:20 msgid "subject" msgstr "assunto" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "conteúdo" #: content/contactform/models.py:34 msgid "contact form" msgstr "formulário de contato" #: content/contactform/models.py:35 msgid "contact forms" msgstr "formulários de contato" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "arquivo" #: content/file/models.py:26 msgid "files" msgstr "arquivos" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "imagem" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "legenda" #: content/image/models.py:53 msgid "images" msgstr "imagens" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "posição" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(sem legenda)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "arquivo de mídia" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "arquivos de mídia" #: content/medialibrary/models.py:139 msgid "block" msgstr "bloco" #: content/medialibrary/models.py:140 msgid "left" msgstr "esquerda" #: content/medialibrary/models.py:141 msgid "right" msgstr "direita" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "tipo" #: content/raw/models.py:18 msgid "raw content" msgstr "conteúdo cru" #: content/raw/models.py:19 msgid "raw contents" msgstr "conteúdos crus" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "Ignorar os avisos de validação HTML" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "A validação HTML produziu %(count)d avisos. Por favor, revise o conteúdo " "atualizado abaixo antes de continuar: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "texto" #: content/richtext/models.py:85 msgid "rich text" msgstr "texto rico" #: content/richtext/models.py:86 msgid "rich texts" msgstr "textos ricos" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "O feed RSS é atualizado por várias vezes ao dia. Uma alteração do título só " "será visível na página após a próxima atualização do feed." #: content/rss/models.py:22 msgid "link" msgstr "ligação" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "conteúdo pré-renderizado" #: content/rss/models.py:24 msgid "last updated" msgstr "última atualização" #: content/rss/models.py:25 msgid "max. items" msgstr "número máximo" #: content/rss/models.py:29 msgid "RSS feed" msgstr "feed RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "feeds RSS" #: content/section/models.py:41 msgid "section" msgstr "seção" #: content/section/models.py:42 msgid "sections" msgstr "seções" #: content/table/models.py:66 msgid "plain" msgstr "simples" #: content/table/models.py:67 msgid "title row" msgstr "linha de título" #: content/table/models.py:69 msgid "title row and column" msgstr "linha e coluna de título" #: content/table/models.py:75 msgid "table" msgstr "tabela" #: content/table/models.py:76 msgid "tables" msgstr "tabelas" #: content/table/models.py:90 msgid "data" msgstr "dados" #: content/template/models.py:51 msgid "template content" msgstr "conteúdo de modelo" #: content/template/models.py:52 msgid "template contents" msgstr "conteúdos de modelo" #: content/video/models.py:25 msgid "video link" msgstr "ligação de vídeo" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Isto deve ser uma ligação para um vídeo do Youtube ou Vimeo, i.e.: http://" "www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "vídeo" #: content/video/models.py:31 msgid "videos" msgstr "vídeos" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "publicado" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Isto também é usado para a navegação gerada automaticamente." #: module/blog/models.py:33 msgid "published on" msgstr "publicado em" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Será definido automaticamente assim que você ativar a caixa `publicado` " "acima." #: module/blog/models.py:39 msgid "entry" msgstr "entrada" #: module/blog/models.py:40 msgid "entries" msgstr "entradas" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "etiquetas" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "tradução de" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Deixe este campo em branco para entradas no idioma original." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "traduções disponíveis" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "data de criação" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "data de modificação" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "tipos de conteúdo" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "Otimização para motores de busca" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "publicar até" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Deixe em branco se a entrada deve ficar ativa para sempre." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "visível de - até" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "Publicação baseada em datas" #: module/extensions/featured.py:9 msgid "featured" msgstr "recomendado" #: module/extensions/featured.py:14 msgid "Featured" msgstr "Recomendado" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta palavras-chave" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Isto será inserido antes da lista de palavras-chave padrão." #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta descrição" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Isto será inserido antes da descrição padrão." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "Otimização para motores de busca" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Editar a tradução" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Criar tradução" #: module/extensions/translations.py:200 msgid "translations" msgstr "traduções" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "Adicionado com sucesso %(count)d arquivo de mídia em %(category)s." msgstr[1] "Adicionado com sucesso %(count)d arquivos de mídia em %(category)s." #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "Adicionar arquivos de mídia selecionados à categoria" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Pré-visualização" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "tamanho do arquivo" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "criado em" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "tipo de arquivo" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "informação do arquivo" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "%d arquivos importados" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "Nenhum arquivo de entrada fornecido" #: module/medialibrary/models.py:43 msgid "parent" msgstr "ascendente" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "categoria" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "categorias" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Imagem" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Vídeo" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Áudio" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "documento PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Texto" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "Texto Rico" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "Arquivo ZIP" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binário" #: module/medialibrary/models.py:236 msgid "description" msgstr "descrição" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "tradução do arquivo de mídia" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "traduções do arquivo de mídia" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Esta URL já está ocupada por uma página ativa." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Esta URL já está ocupada por outra página ativa." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Outras opções" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "na navegação" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Adicionar página descendente" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Ver no site" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "Você não tem as permissões necessárias para editar este objeto" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "herdado" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "extensões" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "ativo" #: module/page/models.py:138 msgid "active" msgstr "ativo" #: module/page/models.py:146 msgid "override URL" msgstr "URL efetiva" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Substitui a URL de destino. Certifique-se de incluir barras no início e no " "final, se for uma URL local. Isso afeta tanto a navegação e URLs de " "subpáginas." #: module/page/models.py:148 msgid "redirect to" msgstr "redirecionar para" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL de destino para redirecionamentos automáticos." #: module/page/models.py:150 msgid "Cached URL" msgstr "URL em cache" #: module/page/models.py:161 msgid "page" msgstr "página" #: module/page/models.py:162 msgid "pages" msgstr "páginas" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "trecho" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "Adicione um breve trecho que sumarize o conteúdo desta página." #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "Trecho" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "extensão de navegação" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Selecione o módulo que fornece sub-páginas para esta página se você precisa " "personalizar a navegação." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "Extensão de navegação" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "Selecione as páginas que devam ser listadas como conteúdo relacionado." #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "Páginas relacionadas" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "Site" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "página de ligação" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "O conteúdo é herdado desta página, se fornecida." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "título do conteúdo" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" "A primeira linha é o título principal, as linhas subsequentes são sub-" "títulos." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "título da página" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Título da página para a janela do navegador. Por padrão, o mesmo que o " "título." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Títulos" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr " Por %(filter_title)s " #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Procurar" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Confirma a remoção do item?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Confirme para remover o item" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Item removido com sucesso." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Impossível remover o item" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "Impossível remover o item, pois ele possui pelo menos um dependente." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Alterar o modelo" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "" "Confirma a alteração do modelo?
    Todas as alterações serão salvas." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Confirma a alteração do modelo?
    As modificações serão gravadas e o " "conteúdo de %(source_regions)s será movido para " "%(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Ocultar" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Mostrar" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "Após" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "Antes" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Inserir novo:" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Região vazia" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "O conteúdo é herdado automaticamente da página ascendente. Para mudar este " "comportamento, adicione algum conteúdo." #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Adicionar novo item" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "Adicionar mais um %(verbose_name)s" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "Remover" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Guardar" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Parar Edição" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "editar" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "novo" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "para cima" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "para baixo" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "remover" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Página inicial" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "Recuperar %(verbose_name)s removido" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" "Pressione o botão de salvar abaixo para recuperar esta versão do objeto." #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "Histórico" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "Reverter %(verbose_name)s" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" "Pressione o botão de salvar abaixo para reverter para esta versão do objeto." #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Atalhos" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Contrair árvore" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Expandir árvore" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtrar" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Editar no site" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "Adicionar" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "página de ligação" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "Selecione a categoria a aplicar:" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" "Os seguintes arquivos de mídia serão adicionados à categoria selecionada:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "Adicionar à categoria" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "Cancelar" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Enviar em massa um arquivo ZIP:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Enviar" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s comentários." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s disse em " "%(comment_submit_date)s
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Não há comentários." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Enviar Comentário" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Enviar" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Obrigado!" #~ msgid "Symlinked page" #~ msgstr "Página de ligação" feincms-1.7.4/feincms/locale/ro/000077500000000000000000000000001212255543400164555ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/ro/LC_MESSAGES/000077500000000000000000000000001212255543400202425ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/ro/LC_MESSAGES/django.mo000066400000000000000000000302041212255543400220400ustar00rootroot00000000000000d 89 O \i x1 D%!9G  f'GZ^ej { 4: H^y | )86@o  4o 7#[[ #0`*D,V1.c2H3{ Gx7I#5Ya ht      ' ,8=BHP Va fpv|        (6HMbf o|       & 0;AFN]cjox}   Kd jxS+d u   $ q #=!a!x!}! !!! !!!!!!!"E%"9k""!"" "" #V#Y#X$ h$v$ $$IB%!%% %"% %%$&;&HD&i& &', '8' ='.I'ox'G'0(9(?)=@)~)+*5,*b*{* *P**E+%++),G,P, V,a,y,, ,, , ,,, ,- -- %-2- 7-A- E-O- V- d-r-{----- - - ---- -- .#.;.S.b.q.............//&/>/ G/S/h/////////////0 000 10 ;0G0K0O0T0d0j0mpyUXtw2[Gug~]3:4D\ }hTVb-n0vJH?ij,K CfY 1^#8AQI`Wr=N*ex{ B|<q$.9F> /L";!_P5zcaEOsS)@+Z'd%ok R&7Ml6( By %(filter_title)s (no caption)Add %(name)sAdd child pageAdd new itemAll content is inherited from this page if given.BinaryCached URLCannot delete itemCannot delete item, because it is parent of at least one other item.Cannot make a node a child of itself.Cannot remove this frame while inside this admin section.Change %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create hidden copy of this pageCreate translationCutDeleteEditEdit translationExpand treeFilterFlashHomeImageInsert as childInsert beforeItem deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language (%s).Move selected item toNo item has been selected.OKOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.Please correct the error below.Please correct the errors below.PreviewPropertiesRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyReloadReplace page %(to_replace)sSaveSave and add anotherSave and continue editingSearchSelect an item on the left side if you want to edit it.Select the module providing subpages for this page if you need to customize the navigation.ShortcutsSubmitTarget URL for automatic redirects.TextThanks!The %(name)s "%(obj)s" was changed successfully.The context menu on the tree root and tree nodes provide you with additional modes of operation.The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.Tree saved successfully.Video from unknown portalView on siteWill be set automatically once you tick the `published` checkbox above.You can change the structure of the tree by drag-dropping elements. Please note that changes will be saved immediately. You have replaced %s. You may continue editing the now-active page below.You may add another %s below.You may edit it again below.You may edit the copied page below.actionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycontact formcontact formscontentcontent titlecopyrightcreatedcreation datedatadescriptiondowneditemailentriesentryextensionsfilefile typefilesimageimagesin navigationinheritedis visiblelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionneworderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textsrightslugsubjectsymlinked pagetabletablestagstemplatetexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FienCMS Report-Msgid-Bugs-To: POT-Creation-Date: 2009-09-04 16:22+0200 PO-Revision-Date: 2009-07-16 17:21+0100 Last-Translator: Gabriel Kovacs Language-Team: ro MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Language: Romanian X-Poedit-SourceCharset: utf-8 X-Poedit-Country: ROMANIA După %(filter_title)s(fără legendă)Adaugă %(name)sAdaugă o pagină copilAdaugă un obiect nouÎntreg conținutul este moștenit de la această pagină daca se dorește.BinarURL în cacheNu pot șterge obiectulNu se poate șterge obiectul, deoarece este părinte la cel puțin incă un obiect.Un nod nu poate fi făcut un copil al său.Acestă zonă nu se poate șterge atâta timp cât se află în această secțiune a administrării.Modifică %sModifică șablonÎnchide arboreleConfirmți pentru a șterge obiectulConținutul de la pagina părinte este moștenită automat. Pentru a suprascrie acest lucru, adăugați conținutCreează o copie ascunsă a paginiiCreează o translatareTaieȘtergeModificăModifică translatareaDeschide arboreleFiltreazăFlashAcasăImagineInserează ca și copilInserează inainteObiectul a fost șters cu succes.Lasă gol dacă înregistrarea ar trebui să fie activă întotdeaunaLăsați gol pentru inregistrări in limba primară (%s).Mută obiectul selectat laNiciun obiect nu a fost selectat.OKAlte opțiuniSuprascrie URL-ul țintă. Aveți grijă să scrieti / la început și la șfârșit dacă este un URL local.Aceasta afectează atât navigația cât și subpaginile.document PDFTitlul paginii pentru fereastra navigatorului. Implicit este la fel cu titlul paginii.Vă rugăm să corectați eroarea de mai josVă rugăm să corectați erorile de mai josPre-vizualizareProprietățiflux RSSfluxuri RSSDoriți ștergerea șablonului?
    Toate schimbările au fost salvate și conținutul de la %(source_regions)s a fost mutat la %(target_region)s.Doriți ștergerea șablonului?
    Toate modificarile au fost salvate.Confirmți ștergerea obiectului?Regiunea este goalăReîncarcăÎnlocuieste pagina %(to_replace)sSalveazăSalvează si adaugă altaSalvează și continuă să modificiCăutareSelectați un obiect din partea stângă dacă doriți să-l modificațiSelectați modulul care furnizează subpaginile pentru această pagină dacă doriți să personalizaţi.ScurtăturiTrimiteURL-ul țintă pentru redirectări automate.TextMulțumesc!%(name)s "%(obj)s" a fost modificat cu succes.Meniul contextual al arborelui rădăcină și ale nodurilor pune la dispoziție moduri de operare adiționale.Prima linie reprezintă titlul principal, următoarele sunt subtitluri.Fluxul RSS este actualizat de mai multe ori pe zi. O modificare a titlului va fi vizibilă in prima pagină după următoarea actualizare a fluxului.Acest URL este deja rezervat de către o pagină activă.Acest URL este deja rezervat de către o altă pagină activă.Aceasta este deasemenea folosită pentru navigarea generată.Aceasta ar trebui să fie o legătură către un film de pe youtube sau vimeo, de ex.: http://www.youtube.com/watch?v=zmj1rpzDRZ0Va fi inserată la descrierea predefinită.Va fi inserat la lista predefinită de cuvinte cheie.Arbore salvat cu succes.Film de pe un portal necunoscutVezi pe siteVa fi trimis automat în momentul in care bifați butonul `publicat` de mai sus.Se poate schimba structura arborelui prin tragere și lăsare ( mutare ) a unui element. Luați notă faptul că aceste schimbări for fi salvate imediatAi înlocuit %s. Poți continua să modifici actuala pagină activă.Poți adăuga %s incă odata mai jos.Poți să-l modifici din nou.Puteți modifica pagina copiată mai jos.acțiuniactivaplicațieconținutul aplicațieiconținuturile aplicațieitraduceri disponibileblocheazălegendăcategoriicategorieformular de contactformulare de contactconținuttitlu conținutcopyrightcreatdata creeriidatadescrierejosmodificăe-mailînregistrariînregistrareextensiifișiertipul fișieruluifișiereimagineimaginiîn navigaremoșteniteste vizibillimbăultima actualizarestângalegăturănr. de obiecte maximefișier mediatraducere fișier mediatraduceri fișier mediafișiere mediadescriere metacuvinte cheie metadata modificăriinumenavigare extinsănouordonaresuprascrie URLpaginătitlul paginiipaginipărintesimplupozițieconținut predefinitdata publicăriisfârșitul publicăriipublicatpublicat laconținut neformatatconținuturi neformatateredirecționare cătrescoatetext formatabiltexte formatabiledreaptaslugsubiectlegătură paginătabeltabeleeticheteșablontexttitlutitlutitlu rând și coloanătradus detranslațiitipsusfilmlegătură filmfilmevizibil de la - până lafeincms-1.7.4/feincms/locale/ro/LC_MESSAGES/django.po000066400000000000000000000563411212255543400220550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # GABRIEL KOVACS , 2010. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/feincms/" "language/ro/)\n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" "2:1))\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "șablon" #: models.py:551 msgid "ordering" msgstr "ordonare" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "limbă" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Modifică %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "titlu" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "" #: admin/tree_editor.py:417 msgid "actions" msgstr "acțiuni" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Confirmți ștergerea obiectului?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "conținutul aplicației" #: content/application/models.py:273 msgid "application contents" msgstr "conținuturile aplicației" #: content/application/models.py:298 msgid "application" msgstr "aplicație" #: content/comments/models.py:24 msgid "enabled" msgstr "" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "" #: content/comments/models.py:49 msgid "public" msgstr "" #: content/comments/models.py:49 msgid "not public" msgstr "" #: content/contactform/models.py:18 msgid "name" msgstr "nume" #: content/contactform/models.py:19 msgid "email" msgstr "e-mail" #: content/contactform/models.py:20 msgid "subject" msgstr "subiect" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "conținut" #: content/contactform/models.py:34 msgid "contact form" msgstr "formular de contact" #: content/contactform/models.py:35 msgid "contact forms" msgstr "formulare de contact" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "fișier" #: content/file/models.py:26 msgid "files" msgstr "fișiere" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "imagine" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "legendă" #: content/image/models.py:53 msgid "images" msgstr "imagini" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "poziție" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(fără legendă)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "fișier media" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "fișiere media" #: content/medialibrary/models.py:139 msgid "block" msgstr "blochează" #: content/medialibrary/models.py:140 msgid "left" msgstr "stânga" #: content/medialibrary/models.py:141 msgid "right" msgstr "dreapta" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "tip" #: content/raw/models.py:18 msgid "raw content" msgstr "conținut neformatat" #: content/raw/models.py:19 msgid "raw contents" msgstr "conținuturi neformatate" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "text" #: content/richtext/models.py:85 msgid "rich text" msgstr "text formatabil" #: content/richtext/models.py:86 msgid "rich texts" msgstr "texte formatabile" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" "Fluxul RSS este actualizat de mai multe ori pe zi. O modificare a titlului " "va fi vizibilă in prima pagină după următoarea actualizare a fluxului." #: content/rss/models.py:22 msgid "link" msgstr "legătură" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "conținut predefinit" #: content/rss/models.py:24 msgid "last updated" msgstr "ultima actualizare" #: content/rss/models.py:25 msgid "max. items" msgstr "nr. de obiecte maxime" #: content/rss/models.py:29 msgid "RSS feed" msgstr "flux RSS" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "fluxuri RSS" #: content/section/models.py:41 msgid "section" msgstr "" #: content/section/models.py:42 msgid "sections" msgstr "" #: content/table/models.py:66 msgid "plain" msgstr "simplu" #: content/table/models.py:67 msgid "title row" msgstr "titlu" #: content/table/models.py:69 msgid "title row and column" msgstr "titlu rând și coloană" #: content/table/models.py:75 msgid "table" msgstr "tabel" #: content/table/models.py:76 msgid "tables" msgstr "tabele" #: content/table/models.py:90 msgid "data" msgstr "data" #: content/template/models.py:51 msgid "template content" msgstr "" #: content/template/models.py:52 msgid "template contents" msgstr "" #: content/video/models.py:25 msgid "video link" msgstr "legătură film" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Aceasta ar trebui să fie o legătură către un film de pe youtube sau vimeo, " "de ex.: http://www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "film" #: content/video/models.py:31 msgid "videos" msgstr "filme" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "publicat" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Aceasta este deasemenea folosită pentru navigarea generată." #: module/blog/models.py:33 msgid "published on" msgstr "publicat la" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Va fi trimis automat în momentul in care bifați butonul `publicat` de mai " "sus." #: module/blog/models.py:39 msgid "entry" msgstr "înregistrare" #: module/blog/models.py:40 msgid "entries" msgstr "înregistrari" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "etichete" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "tradus de" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "traduceri disponibile" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "data creerii" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "data modificării" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "data publicării" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "sfârșitul publicării" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Lasă gol dacă înregistrarea ar trebui să fie activă întotdeauna" #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "vizibil de la - până la" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "" #: module/extensions/featured.py:9 msgid "featured" msgstr "" #: module/extensions/featured.py:14 msgid "Featured" msgstr "" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "cuvinte cheie meta" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "Va fi inserat la lista predefinită de cuvinte cheie." #: module/extensions/seo.py:11 msgid "meta description" msgstr "descriere meta" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "Va fi inserată la descrierea predefinită." #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Modifică translatarea" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Creează o translatare" #: module/extensions/translations.py:200 msgid "translations" msgstr "translații" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Pre-vizualizare" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "creat" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "tipul fișierului" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "părinte" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "categorie" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "categorii" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "copyright" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Imagine" #: module/medialibrary/models.py:203 msgid "Video" msgstr "" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "document PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Text" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Binar" #: module/medialibrary/models.py:236 msgid "description" msgstr "descriere" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "traducere fișier media" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "traduceri fișier media" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Acest URL este deja rezervat de către o pagină activă." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Acest URL este deja rezervat de către o altă pagină activă." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Alte opțiuni" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "în navigare" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "Adaugă o pagină copil" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "Vezi pe site" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "moștenit" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "extensii" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "" #: module/page/models.py:138 msgid "active" msgstr "activ" #: module/page/models.py:146 msgid "override URL" msgstr "suprascrie URL" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "Suprascrie URL-ul țintă. Aveți grijă să scrieti / la început și la șfârșit " "dacă este un URL local.Aceasta afectează atât navigația cât și subpaginile." #: module/page/models.py:148 msgid "redirect to" msgstr "redirecționare către" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "URL-ul țintă pentru redirectări automate." #: module/page/models.py:150 msgid "Cached URL" msgstr "URL în cache" #: module/page/models.py:161 msgid "page" msgstr "pagină" #: module/page/models.py:162 msgid "pages" msgstr "pagini" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "navigare extinsă" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" "Selectați modulul care furnizează subpaginile pentru această pagină dacă " "doriți să personalizaţi." #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "legătură pagină" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "Întreg conținutul este moștenit de la această pagină daca se dorește." #: module/page/extensions/titles.py:13 msgid "content title" msgstr "titlu conținut" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "Prima linie reprezintă titlul principal, următoarele sunt subtitluri." #: module/page/extensions/titles.py:15 msgid "page title" msgstr "titlul paginii" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Titlul paginii pentru fereastra navigatorului. Implicit este la fel cu " "titlul paginii." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "După %(filter_title)s" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Căutare" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Confirmți ștergerea obiectului?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Confirmți pentru a șterge obiectul" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Obiectul a fost șters cu succes." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Nu pot șterge obiectul" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Nu se poate șterge obiectul, deoarece este părinte la cel puțin incă un " "obiect." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Modifică șablon" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Doriți ștergerea șablonului?
    Toate modificarile au fost salvate." #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "Doriți ștergerea șablonului?
    Toate schimbările au fost salvate și " "conținutul de la %(source_regions)s a fost mutat la " "%(target_region)s." #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Regiunea este goală" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" "Conținutul de la pagina părinte este moștenită automat. Pentru a suprascrie " "acest lucru, adăugați conținut" #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Adaugă un obiect nou" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Salvează" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "modifică" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "nou" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "sus" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "jos" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "scoate" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Acasă" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "Scurtături" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Închide arborele" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Deschide arborele" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "Filtrează" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "" #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" #: templates/content/comments/default.html:28 msgid "No comments." msgstr "" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Trimite" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Mulțumesc!" feincms-1.7.4/feincms/locale/ru/000077500000000000000000000000001212255543400164635ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/ru/LC_MESSAGES/000077500000000000000000000000001212255543400202505ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/ru/LC_MESSAGES/django.mo000066400000000000000000000436021212255543400220540ustar00rootroot00000000000000 ``a$ "9&`} $1&,3:RYDla & 6Df[& 0 8'Dlut|#' -94T5 "/ CQ  8@ GBTD4}     !+07R6l[  %r,#TD4Ay,A1n.c233f G<9Tl      ! / 7 E S [ i n z           !! !$!)! .! 9! D!P! a!o!!!! !! !! !!!!!!! " " *" 6" C"O" V" `"k"q"y"""""""""""" ""# #"#'#*# 0#;#B#T#z$+\%*%C%%&n &(&2&<&('DH'&' ''O' (!(&(G7((2((wr)))*/*8M**f+7+P+* ,8,X,!i,B, , ,, -- -V-A.7X.+..c?/ ///'02(0 [0|000111~2)2\2S3j33[4G4)=5g5#}55!5 55 5=5$;6`6q6R7 e7r77/7778O8 8 9g9p9e9X:CT;P;W;A<D<Z2== =$==Lh>3>3>9?W?f?w??.?.?#?@(@7@J@]@&t@&@@)@A A"A WA'x cg(Sl Q9hp@%.;<$OtR#B43ZC:Dy)imLf0"`]^G!,+b=FYrJ-kNudov/2*P %(comment_username)s said on %(comment_submit_date)s
    %(comment_count)s comments.%d files imported%s has been moved to a new position.(no caption)AddAdd a brief excerpt summarizing the content of this page.Add another %(verbose_name)sAdd child pageAdd media files to categoryAdd new itemAdd selected media files to categoryAdd to categoryAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:CancelCannot delete itemCannot delete item, because it is parent of at least one other item.Cannot overwrite with different file type (attempt to overwrite a %(old_ext)s with a %(new_ext)s)CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Create translationDate-based publishingDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeExport selected media files as zip fileFeaturedFilterHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHistoryHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.OverwritePDF documentPage title for browser window. Same as title by default.ParentPost CommentPress the save button below to recover this version of the object.Press the save button below to revert to this version of the object.PreviewReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Recover deleted %(verbose_name)sRegion emptyRelated pagesRemoveRevert %(verbose_name)sRich TextSaveSearchSearch engine optimizationSelect category to apply:Select pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowSiteStop EditingSubmitSuccessfully added %(count)d media file to %(category)s.Successfully added %(count)d media files to %(category)s.Symlinked pageTarget URL for automatic redirects.TextThanks!The content from the original translation has been copied to the newly created page.The first line is the main title, the following lines are subtitles.The following media files will be added to the selected category:The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You don't have the necessary permissions to edit this objectZIP file export failed: %sZIP file exported as %sZIP import failed: %sZip archiveactionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescreatedcreation datedatadescriptiondowneditenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentpositionpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textsrightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: Report-Msgid-Bugs-To: POT-Creation-Date: 2012-03-23 11:30+0700 PO-Revision-Date: Last-Translator: Mikhail Korobov Language-Team: RUSSIAN Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; Пользователь %(comment_username)s сказал (%(comment_submit_date)s)
    %(comment_count)s комментариев.%d файлов импортированоУзел "%s" был перемещен на новое место.(без подписи)ДобавитьДобавить краткую выдержку описывающую содержимое страницы.Добавить еще %(verbose_name)sДобавить дочернюю страницуДобавить медиа файлы в категориюДобавить элементДобавить выбранные файлы в категориюДобавить в категориюПослеВсеВсе содержимое будет взято с этой страницы.АудиоДоДвоичныйЗагрузить несколько файлов в ZIP-архиве:Отменитьневозможно удалить элементНевозможно удалить элемент, т.к. он является родителем как минимум для одного другого элемента.Невозможно изменить тип файла (Попытка сохранить %(old_ext)s в %(new_ext)s))КатегорияИзменить %sИзменить шаблонСвернуть деревоПодтвердите удаление элементаСодержимое родительского элемента автоматически наследуется. Для перекрытия этого поведение нужно добавить содержимое.Создать переводПубликация основанная на датеПеремещение не удалось. Непонятная команда.Редактировать на сайтеИзменить переводВыдержкаРазвернуть деревоУпаковать выбранные файлы в ZIP-архивсозданФильтрВо время проверки HTML обнаружено %(count)d предупреджений. Перед тем как продолжить обратите внимание на следующее: %(messages)sСкрытьИсторияНачалоИгнорировать предупреждения о некорректном HTMLИзображениеВставить перед этим элементомЭлемент успешно удален.Оставьте поле пустым, если запись должна оставаться активной навсегда.Оставьте поле пустым для записей на основном языке (%s).документ Microsoft ExcelPowerPoint документдокумент Microsoft WordРасширение навигацииМожно добавить комментарииКомментариев нет.не заданы файлыДругие параметрыПерекрыть адрес. Убедитесь что адрес начинается и заканчивается слэшем (/) для локальных адресов. Это отностися и к навигации и к подстраницам.ПерезаписатьДокумент PDFЗаголовок страницы для окна браузера. По умолчанию = просто заголовку страницы.РодительОтправить комментарийДля восстановления этой версии нажмите сохранить.Для возврата к этой версии нажмите сохранить.ПредпросмотрВы действительно хотите изменить шаблон?
    Все сохраненные изменение и содержимое региона %(source_regions)s будут перенесены в %(target_region)s.Точно сменить шаблон?
    Все изменения сохранены.Вы уверены, что хотите удалить элемент?Восстановить %(verbose_name)sРегион пустСвязанные страницыУдалитьОтменить %(verbose_name)sТекстСохранитьИскатьОптимизация для поисковых системВыберите категорию:Выбертие страницу, которая будет показана в списке связанных страницВыберите модуль, расширяющий навигацию по дочерним страницамОтправитьЯрлыкиПокзатьСайтЗакончить редактированиеОтправитьДобавлено %(count)d документов в %(category)s.Добавлен %(count)d документ в %(category)s.Добавлено %(count)d документов в %(category)s.Страница-ссылкаАдрес для автоматического перенаправленияТекстСпасибо!Содержимое с оригинальной страницы скопировано в новую.ПЕрвая строка - основной заголовок, остальное - подзаголовокиСледующие файлы будут добавлены в выбранную категорию:Данное поле обновляется несколько раз в день. Изменения в названии на домашней странице будут видны только после следующегог обновленияЭтот URL уже занят активной страницей.Этот URL уже занят другой активной страницей.Используется также в сгенерированно навигации.Это должно быть ссылкой на видео, размещенное на youtube или vimeo, например, http://www.youtube.com/watch?v=zmj1rpzDRZ0Будет добавлено к основному описаниюБудет добавлено к основному списку ключевых словЗаголовкиВидеоПосмотреть на сайтеБудет установлено автоматически, как только Вы отметите пункт "опубликовано" выше.У вас нет прад для редактирования объектаОшибка экспорта в ZIP-архив: %sZIP-архив экспортирован как %sЗагрузка ZIP-архива не удалась: %sZip-архивдействияактивнаяприложениесодержимое из приложениясодержимое из приложениядоступные переводыблокподписькатегориикатегориякомментарииформа обратной связиформы обратной связисодержимоеЗаголовок содержимоготип данныхсоздандата созданияданныеописаниевнизредактироватьвключенызаписизаписьвыдержкарасширениясозданфайлфайлразмер файлатип файлафайлыизображениеизображенияв навигацииунаследованоактивнаяязыкпоследнее обновлениеслевассылкамакс. число элементовмедиа файлмедиа файлыописаниеключевые словадата измененияимярасширение навигацииновыйне опубликованосортировкаперекрыть адресстраницазаголовок страницыстраницыродительрасположениеопубликованодата публикациидата окончания публикацииопубликованоопубликованосырые данныесырые данныередирект наудалитьформатированный текстформатированный текстысправасекциясекциипуть в URLтемаСтраница-ссылкатаблицатаблицытегишаблонсодержимое шаблонасодержимое шаблонатекстзаголовокзаголовок строкизаголовок строки и столбцаперевод дляпереводытипвверхвидеоссылка на видеовидеовидима с - поfeincms-1.7.4/feincms/locale/ru/LC_MESSAGES/django.po000066400000000000000000000573731212255543400220710ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Mikhail Korobov , 2009. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: LANGUAGE \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "шаблон" #: models.py:551 msgid "ordering" msgstr "сортировка" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "язык" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "Все" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "Родитель" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "Категория" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "Изменить %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "заголовок" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "Узел \"%s\" был перемещен на новое место." #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "Перемещение не удалось. Непонятная команда." #: admin/tree_editor.py:417 msgid "actions" msgstr "действия" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "Вы уверены, что хотите удалить элемент?" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "" #: content/application/models.py:273 msgid "application contents" msgstr "" #: content/application/models.py:298 msgid "application" msgstr "приложение" #: content/comments/models.py:24 msgid "enabled" msgstr "включены" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "" #: content/comments/models.py:49 msgid "public" msgstr "" #: content/comments/models.py:49 msgid "not public" msgstr "" #: content/contactform/models.py:18 msgid "name" msgstr "имя" #: content/contactform/models.py:19 msgid "email" msgstr "" #: content/contactform/models.py:20 msgid "subject" msgstr "тема" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "содержание" #: content/contactform/models.py:34 msgid "contact form" msgstr "форма обратной связи" #: content/contactform/models.py:35 msgid "contact forms" msgstr "формы обратной связи" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "файл" #: content/file/models.py:26 msgid "files" msgstr "файлы" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "картинка" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "подпись" #: content/image/models.py:53 msgid "images" msgstr "картинки" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "расположение" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(без подписи)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "" #: content/medialibrary/models.py:139 msgid "block" msgstr "блок" #: content/medialibrary/models.py:140 msgid "left" msgstr "слева" #: content/medialibrary/models.py:141 msgid "right" msgstr "справа" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "тип" #: content/raw/models.py:18 msgid "raw content" msgstr "" #: content/raw/models.py:19 msgid "raw contents" msgstr "" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "текст" #: content/richtext/models.py:85 msgid "rich text" msgstr "" #: content/richtext/models.py:86 msgid "rich texts" msgstr "" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" #: content/rss/models.py:22 msgid "link" msgstr "ссылка" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "" #: content/rss/models.py:24 msgid "last updated" msgstr "последнее обновление" #: content/rss/models.py:25 msgid "max. items" msgstr "макс. число элементов" #: content/rss/models.py:29 msgid "RSS feed" msgstr "" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "" #: content/section/models.py:41 msgid "section" msgstr "" #: content/section/models.py:42 msgid "sections" msgstr "" #: content/table/models.py:66 msgid "plain" msgstr "" #: content/table/models.py:67 msgid "title row" msgstr "" #: content/table/models.py:69 msgid "title row and column" msgstr "" #: content/table/models.py:75 msgid "table" msgstr "таблица" #: content/table/models.py:76 msgid "tables" msgstr "таблицы" #: content/table/models.py:90 msgid "data" msgstr "данные" #: content/template/models.py:51 msgid "template content" msgstr "" #: content/template/models.py:52 msgid "template contents" msgstr "" #: content/video/models.py:25 msgid "video link" msgstr "ссылка на видео" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "Это должно быть ссылкой на видео, размещенное на youtube или vimeo, " "например, http://www.youtube.com/watch?v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "видео" #: content/video/models.py:31 msgid "videos" msgstr "видео" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "опубликовано" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "Используется также в сгенерированно навигации." #: module/blog/models.py:33 msgid "published on" msgstr "опубликовано" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" "Будет установлено автоматически, как только Вы отметите пункт \"опубликовано" "\" выше." #: module/blog/models.py:39 msgid "entry" msgstr "запись" #: module/blog/models.py:40 msgid "entries" msgstr "записи" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "теги" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "Оставьте поле пустым для записей на основном языке (%s)." #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "доступные переводы" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "дата создания" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "дата изменения" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "дата публикации" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "дата окончания публикации" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "Оставьте поле пустым, если запись должна оставаться активной навсегда." #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "" #: module/extensions/featured.py:9 msgid "featured" msgstr "" #: module/extensions/featured.py:14 msgid "Featured" msgstr "" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "" #: module/extensions/seo.py:11 msgid "meta description" msgstr "" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "" #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "Изменить перевод" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "Создать перевод" #: module/extensions/translations.py:200 msgid "translations" msgstr "переводы" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "Предпросмотр" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "размер файла" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "создан" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "тип файла" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "родитель" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "путь в URL" #: module/medialibrary/models.py:49 msgid "category" msgstr "категория" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "категории" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "" #: module/medialibrary/models.py:202 msgid "Image" msgstr "Изображение" #: module/medialibrary/models.py:203 msgid "Video" msgstr "Видео" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "Аудио" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "Документ PDF" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "" #: module/medialibrary/models.py:207 msgid "Text" msgstr "Текст" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "Двоичный" #: module/medialibrary/models.py:236 msgid "description" msgstr "описание" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "Этот URL уже занят активной страницей." #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "Этот URL уже занят другой активной страницей." #: module/page/modeladmins.py:41 msgid "Other options" msgstr "Другие параметры" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "в навигации" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "расширения" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "" #: module/page/models.py:138 msgid "active" msgstr "активная" #: module/page/models.py:146 msgid "override URL" msgstr "" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" #: module/page/models.py:148 msgid "redirect to" msgstr "редирект на" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "" #: module/page/models.py:150 msgid "Cached URL" msgstr "" #: module/page/models.py:161 msgid "page" msgstr "страница" #: module/page/models.py:162 msgid "pages" msgstr "страницы" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "" #: module/page/extensions/titles.py:13 msgid "content title" msgstr "" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" #: module/page/extensions/titles.py:15 msgid "page title" msgstr "заголовок страницы" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" "Заголовок страницы для окна браузера. По умолчанию = просто заголовку " "страницы." #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "Заголовки" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "Искать" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "Вы уверены, что хотите удалить элемент?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "Подтвердите удаление элемента" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "Элемент успешно удален." #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "Не выходит удалить элемент" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" "Не выходит удалить элемент, т.к. он является родителем как минимум для " "одного другого элемента." #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "Изменить шаблон" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "Точно сменить шаблон?
    Все изменения сохранены." #: templates/admin/feincms/_messages_js.html:9 #, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "Скрыть" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "Покзать" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "После" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "До" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "Вставить перед этим элементом" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "Регион пуст" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "Добавить элемент" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "Сохранить" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "Закончить редактирование" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "редактировать" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "новый" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "вверх" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "вниз" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "удалить" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "Начало" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "Свернуть дерево" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "Развернуть дерево" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "Редактировать на сайте" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "Загрузить несколько файлов в ZIP-архиве:" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "Отправить" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s комментариев." #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " Пользователь %(comment_username)s сказал " "(%(comment_submit_date)s)
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "Комментариев нет." #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "Отправить комментарий" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "Отправить" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "Спасибо!" feincms-1.7.4/feincms/locale/tr/000077500000000000000000000000001212255543400164625ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/tr/LC_MESSAGES/000077500000000000000000000000001212255543400202475ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/tr/LC_MESSAGES/django.po000066400000000000000000000476051212255543400220650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: Matthias Kestenholz \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/feincms/language/" "tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "" #: models.py:551 msgid "ordering" msgstr "" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "" #: admin/tree_editor.py:417 msgid "actions" msgstr "" #: admin/tree_editor.py:429 #, python-format msgid "Successfully deleted %s items." msgstr "" #: admin/tree_editor.py:437 #, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "" #: content/application/models.py:272 msgid "application content" msgstr "" #: content/application/models.py:273 msgid "application contents" msgstr "" #: content/application/models.py:298 msgid "application" msgstr "" #: content/comments/models.py:24 msgid "enabled" msgstr "" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "" #: content/comments/models.py:49 msgid "public" msgstr "" #: content/comments/models.py:49 msgid "not public" msgstr "" #: content/contactform/models.py:18 msgid "name" msgstr "" #: content/contactform/models.py:19 msgid "email" msgstr "" #: content/contactform/models.py:20 msgid "subject" msgstr "" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "" #: content/contactform/models.py:34 msgid "contact form" msgstr "" #: content/contactform/models.py:35 msgid "contact forms" msgstr "" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "" #: content/file/models.py:26 msgid "files" msgstr "" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "" #: content/image/models.py:53 msgid "images" msgstr "" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "" #: content/medialibrary/models.py:139 msgid "block" msgstr "" #: content/medialibrary/models.py:140 msgid "left" msgstr "" #: content/medialibrary/models.py:141 msgid "right" msgstr "" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "" #: content/raw/models.py:18 msgid "raw content" msgstr "" #: content/raw/models.py:19 msgid "raw contents" msgstr "" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "" #: content/richtext/models.py:85 msgid "rich text" msgstr "" #: content/richtext/models.py:86 msgid "rich texts" msgstr "" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "" #: content/rss/models.py:22 msgid "link" msgstr "" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "" #: content/rss/models.py:24 msgid "last updated" msgstr "" #: content/rss/models.py:25 msgid "max. items" msgstr "" #: content/rss/models.py:29 msgid "RSS feed" msgstr "" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "" #: content/section/models.py:41 msgid "section" msgstr "" #: content/section/models.py:42 msgid "sections" msgstr "" #: content/table/models.py:66 msgid "plain" msgstr "" #: content/table/models.py:67 msgid "title row" msgstr "" #: content/table/models.py:69 msgid "title row and column" msgstr "" #: content/table/models.py:75 msgid "table" msgstr "" #: content/table/models.py:76 msgid "tables" msgstr "" #: content/table/models.py:90 msgid "data" msgstr "" #: content/template/models.py:51 msgid "template content" msgstr "" #: content/template/models.py:52 msgid "template contents" msgstr "" #: content/video/models.py:25 msgid "video link" msgstr "" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" #: content/video/models.py:30 msgid "video" msgstr "" #: content/video/models.py:31 msgid "videos" msgstr "" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "" #: module/blog/models.py:33 msgid "published on" msgstr "" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "" #: module/blog/models.py:39 msgid "entry" msgstr "" #: module/blog/models.py:40 msgid "entries" msgstr "" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "" #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "" #: module/extensions/featured.py:9 msgid "featured" msgstr "" #: module/extensions/featured.py:14 msgid "Featured" msgstr "" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "" #: module/extensions/seo.py:11 msgid "meta description" msgstr "" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "" #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "" #: module/extensions/translations.py:200 msgid "translations" msgstr "" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "" #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "" #: module/medialibrary/models.py:43 msgid "parent" msgstr "" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "" #: module/medialibrary/models.py:49 msgid "category" msgstr "" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "" #: module/medialibrary/models.py:202 msgid "Image" msgstr "" #: module/medialibrary/models.py:203 msgid "Video" msgstr "" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "" #: module/medialibrary/models.py:207 msgid "Text" msgstr "" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "" #: module/medialibrary/models.py:236 msgid "description" msgstr "" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "" #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "" #: module/page/modeladmins.py:41 msgid "Other options" msgstr "" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "" #: module/page/models.py:138 msgid "active" msgstr "" #: module/page/models.py:146 msgid "override URL" msgstr "" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" #: module/page/models.py:148 msgid "redirect to" msgstr "" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "" #: module/page/models.py:150 msgid "Cached URL" msgstr "" #: module/page/models.py:161 msgid "page" msgstr "" #: module/page/models.py:162 msgid "pages" msgstr "" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "" #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "" #: module/page/extensions/titles.py:13 msgid "content title" msgstr "" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "" #: module/page/extensions/titles.py:15 msgid "page title" msgstr "" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "" #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "" #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "" #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "" #: templates/admin/feincms/_messages_js.html:9 #, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "" #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "" #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" #: templates/content/comments/default.html:28 msgid "No comments." msgstr "" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "" feincms-1.7.4/feincms/locale/zh_CN/000077500000000000000000000000001212255543400170365ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/zh_CN/LC_MESSAGES/000077500000000000000000000000001212255543400206235ustar00rootroot00000000000000feincms-1.7.4/feincms/locale/zh_CN/LC_MESSAGES/django.mo000066400000000000000000000275461212255543400224400ustar00rootroot00000000000000\  `2Hd$v 9 !1%W]dk D  f.&   $09@ FtP# 4 5U   8  '14  . 5?DK6f[  !#0TYDa,,1Y.c23Q G<$ 9EM T`t       * /;@EKS[a it}          " :F Wew|    $ . ; G T` g q|   & 3 8 ; A L S ~e `!E"Z"v"" "$" ""###$#B#I#P#`# v# #6## # # # #<#9$ L$Y$r$ $ $$ $$ $$$a$:%A%H%e% l% y%'%-%%%& & & *&4& G&T& &0&' '+' 2' ='H'='( (( 2(?( F(P(W(^(0q(K(( () )) )*) :)D)9K)U))!)*Z8*$*0*** *S+X+q+ +++ +++ ++++++ , ,, $, 1,>,E, L,Y,`,g,k, r,,,,,,,, , , ,,,, ,,,- ---#-3-C-V-i- y-- -- -- -- -- --- -...!.4. G. Q. [. g.t.{. . ...... ..... . . ./ //"/)/0/7/;/ B/O/V/i&wuvU<$4[sI(|X~mOe.=N`o VpxgDhtn Rd> LG\+,y-/9Q?F18bH0_ C)a}l2rB PWqT]A#S{!; @cj*"^3fK:z6Z%'EJM75kY %(comment_username)s said on %(comment_submit_date)s
    By %(filter_title)s %(comment_count)s comments.%d files imported%s has been moved to a new position.(no caption)Add a brief excerpt summarizing the content of this page.Add another %(verbose_name)sAdd child pageAdd new itemAfterAllAll content is inherited from this page if given.AudioBeforeBinaryBulk upload a ZIP file:Cached URLCannot delete itemCannot delete item, because it is parent of at least one other item.CategoryChange %sChange templateCollapse treeConfirm to delete itemContent from the parent site is automatically inherited. To override this behaviour, add some content.Could not access storageCreate translationDate-based publishingDid not understand moving instruction.Edit on siteEdit translationExcerptExpand treeFeaturedFilterFlashHTML TidyHTML validation produced %(count)d warnings. Please review the updated content below before continuing: %(messages)sHideHomeIgnore the HTML validation warningsImageInsert new:Item deleted successfully.Leave empty if the entry should stay active forever.Leave this empty for entries in the primary language.Microsoft ExcelMicrosoft PowerPointMicrosoft WordNavigation extensionNew comments may be addedNo comments.No input file givenOther optionsOverride the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages' URLs.PDF documentPage title for browser window. Same as title by default.ParentPost CommentPreviewRSS feedRSS feedsReally change template?
    All changes are saved and content from %(source_regions)s is moved to %(target_region)s.Really change template?
    All changes are saved.Really delete item?Region emptyRelated pagesRemoveRich TextSaveSearchSearch engine optimizationSelect pages that should be listed as related content.Select the module providing subpages for this page if you need to customize the navigation.SendShortcutsShowStop EditingSubmitSymlinked pageTarget URL for automatic redirects.TextThanks!The first line is the main title, the following lines are subtitles.The rss field is updated several times a day. A change in the title will only be visible on the home page after the next feed update.This URL is already taken by an active page.This URL is already taken by another active page.This is used for the generated navigation too.This should be a link to a youtube or vimeo video, i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0This will be prepended to the default description.This will be prepended to the default keyword list.TitlesVideoView on siteWill be set automatically once you tick the `published` checkbox above.You don't have the necessary permissions to edit this objectZIP file invalid: %sZip archiveactionsactiveapplicationapplication contentapplication contentsavailable translationsblockcaptioncategoriescategorycommentscontact formcontact formscontentcontent titlecontent typescopyrightcreatedcreation datedatadescriptiondowneditemailenabledentriesentryexcerptextensionsfeaturedfilefile infofile sizefile typefilesimageimagesin navigationinheritedis activelanguagelast updatedleftlinkmax. itemsmedia filemedia file translationmedia file translationsmedia filesmeta descriptionmeta keywordsmodification datenamenavigation extensionnewnot publicorderingoverride URLpagepage titlepagesparentplainpositionpre-rendered contentpublicpublication datepublication end datepublishedpublished onraw contentraw contentsredirect toremoverich textrich textsrightsectionsectionsslugsubjectsymlinked pagetabletablestagstemplatetemplate contenttemplate contentstexttitletitle rowtitle row and columntranslation oftranslationstypeupvideovideo linkvideosvisible from - toProject-Id-Version: FeinCMS Report-Msgid-Bugs-To: POT-Creation-Date: 2011-08-05 06:32+0800 PO-Revision-Date: 2011-08-05 10:20+0800 Last-Translator: Mark Renton Language-Team: zh_CN Language: Simplified Chinese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0 %(comment_username)s 在 %(comment_submit_date)s 说
    由 %(filter_title)s%(comment_count)s 条评论导入 %d 个文件%s 已被移至新的位置(无标题)添加一条简要形容页面内容添加另一个 %(verbose_name)s增加子页面新建之后全部所有内容继承于给出的页面音频之前二进制文件批量上传zip文件URL缓存不能删除因为该项是其他的父级条目所以不能删除分类修改 %s改变模板折叠树型确认删除父站的内容已自动继承。添加新内容会覆盖。无法访问储存创建翻译发布基于日期控制无法接受的移动指令站内编辑编辑翻译摘抄展开树型特性过滤器FlashHTMLHTML验证产生 %(count)d 个警告。请在继续前查看下面更新的内容: %(messages)s隐藏首页忽略HTML验证错误警告图片插入新的删除成功如果条目要永久显示,请留空在主要语言项中对这些条目留空。Microsoft ExcelMicrosoft PowerPointMicrosoft Word导航扩展新的评论无评论没有选择文件其他选项覆盖目标URL,如果它是一个本地的URL,一定要包括在开始和结束时的斜线。这会影响导航和子页面的URLPDF文档浏览器窗口显示标题默认为页面标题父级发表评论预览RSS 提要RSS 提要真的修改模板?
    所有修改已保存,%(source_regions)s的内容已被移到%(target_region)s真的要修改模板么?
    全部修改已被保存。真的要删除?空区域相关页面移除富文本保存搜索搜索引擎优化选择页面作为相关页面在列表中显示如果您需要定制的导航,选择提供此页面的子页面模块。发送快捷方式显示暂停编辑提交链接页面转向目标URL纯文本感谢正文第一行作为主标题,第二行作为副标题RSS字段一天内更新多次。标题改动将在feed更新后只在主页显示。此URL已被其他页面使用此URL已被另一个页面使用也被用于产生导航条请输入youtube或vimeo视频链接,比如:http://www.youtube.com/watch?v=zmj1rpzDRZ0这将作为默认的描述被添加这将作为默认的关键字列表被添加。标题视频站内查看一旦你将`发表`复选框以上打勾选中,日志将设置成自动发布。你无权编辑该对象zip文件无效: %szip压缩包动作激活应用程序应用程序内容应用程序内容已有翻译区块题目类别类别评论联系表单联系表单内容内容标题内容类型版权创建创建日期数据描述下编辑电子邮件激活条目条目摘抄扩展特性文件文件信息文件大小文件类型文件图片图片导航中继承激活语言最后更新左链接最大条目数多媒体文件媒体文件翻译媒体文件翻译多媒体文件meta 描述meta 关键词修改日期名称导航扩展新建不公开排序URL覆盖页面页面标题页面父无格式位置预渲染的内容公开发布起始日期发布结束日期已发布发布于raw contentraw contents转向移除富文本富文本右版块版块slug主题链接页面表格表格标签模板模板内容模板内容纯文本标题标题行标题行和列翻译翻译类型上视频视频链接视频可查看日期feincms-1.7.4/feincms/locale/zh_CN/LC_MESSAGES/django.po000066400000000000000000000572441212255543400224410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # Mark Renton , 2011. msgid "" msgstr "" "Project-Id-Version: FeinCMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-16 18:17+0200\n" "PO-Revision-Date: 2012-06-15 08:25+0000\n" "Last-Translator: aaffdd11 \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/feincms/" "language/zh_CN/)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" #: models.py:420 content/template/models.py:59 msgid "template" msgstr "模板" #: models.py:551 msgid "ordering" msgstr "排序" #: translations.py:259 module/blog/extensions/translations.py:17 #: module/extensions/translations.py:119 msgid "language" msgstr "语言" #: admin/filterspecs.py:35 admin/filterspecs.py:70 msgid "All" msgstr "全部" #: admin/filterspecs.py:46 module/page/models.py:143 msgid "Parent" msgstr "父级" #: admin/filterspecs.py:81 #: templates/admin/medialibrary/mediafile/change_list.html:14 msgid "Category" msgstr "分类" #: admin/item_editor.py:157 #, python-format msgid "Change %s" msgstr "修改 %s" #: admin/tree_editor.py:229 content/rss/models.py:20 #: content/section/models.py:34 module/blog/models.py:29 #: module/medialibrary/models.py:40 module/page/models.py:141 #: module/page/models.py:199 msgid "title" msgstr "标题" #: admin/tree_editor.py:404 #, python-format msgid "%s has been moved to a new position." msgstr "%s 已被移至新的位置" #: admin/tree_editor.py:408 msgid "Did not understand moving instruction." msgstr "无法接受的移动指令" #: admin/tree_editor.py:417 msgid "actions" msgstr "动作" #: admin/tree_editor.py:429 #, fuzzy, python-format msgid "Successfully deleted %s items." msgstr "真的要删除?" #: admin/tree_editor.py:437 #, fuzzy, python-format msgid "Delete selected %(verbose_name_plural)s" msgstr "Recover deleted %(verbose_name)s" #: content/application/models.py:272 msgid "application content" msgstr "应用程序内容" #: content/application/models.py:273 msgid "application contents" msgstr "应用程序内容" #: content/application/models.py:298 msgid "application" msgstr "应用程序" #: content/comments/models.py:24 msgid "enabled" msgstr "激活" #: content/comments/models.py:24 msgid "New comments may be added" msgstr "新的评论" #: content/comments/models.py:28 content/comments/models.py:29 msgid "comments" msgstr "评论" #: content/comments/models.py:49 msgid "public" msgstr "公开" #: content/comments/models.py:49 msgid "not public" msgstr "不公开" #: content/contactform/models.py:18 msgid "name" msgstr "名称" #: content/contactform/models.py:19 msgid "email" msgstr "电子邮件" #: content/contactform/models.py:20 msgid "subject" msgstr "主题" #: content/contactform/models.py:23 content/raw/models.py:14 msgid "content" msgstr "内容" #: content/contactform/models.py:34 msgid "contact form" msgstr "联系表单" #: content/contactform/models.py:35 msgid "contact forms" msgstr "联系表单" #: content/file/models.py:20 content/file/models.py:25 #: module/medialibrary/models.py:84 msgid "file" msgstr "文件" #: content/file/models.py:26 msgid "files" msgstr "文件" #: content/image/models.py:43 content/image/models.py:52 msgid "image" msgstr "图片" #: content/image/models.py:46 msgid "alternate text" msgstr "" #: content/image/models.py:47 msgid "Description of image" msgstr "" #: content/image/models.py:48 module/medialibrary/models.py:235 msgid "caption" msgstr "题目" #: content/image/models.py:53 msgid "images" msgstr "图片" #: content/image/models.py:79 content/medialibrary/models.py:115 #: content/medialibrary/models.py:123 msgid "position" msgstr "位置" #: content/image/models.py:87 msgid "format" msgstr "" #: content/medialibrary/models.py:48 msgid "(no caption)" msgstr "(无标题)" #: content/medialibrary/models.py:97 content/medialibrary/models.py:111 #: content/medialibrary/models.py:121 content/medialibrary/v2.py:48 #: content/section/models.py:36 module/medialibrary/fields.py:58 #: module/medialibrary/models.py:97 msgid "media file" msgstr "多媒体文件" #: content/medialibrary/models.py:98 content/medialibrary/v2.py:49 #: module/medialibrary/models.py:98 msgid "media files" msgstr "多媒体文件" #: content/medialibrary/models.py:139 msgid "block" msgstr "区块" #: content/medialibrary/models.py:140 msgid "left" msgstr "左" #: content/medialibrary/models.py:141 msgid "right" msgstr "右" #: content/medialibrary/v2.py:53 content/section/models.py:52 #: content/table/models.py:85 msgid "type" msgstr "类型" #: content/raw/models.py:18 msgid "raw content" msgstr "raw content" #: content/raw/models.py:19 msgid "raw contents" msgstr "raw contents" #: content/richtext/models.py:22 msgid "HTML Tidy" msgstr "HTML Tidy" #: content/richtext/models.py:23 msgid "Ignore the HTML validation warnings" msgstr "忽略HTML验证错误警告" #: content/richtext/models.py:47 #, python-format msgid "" "HTML validation produced %(count)d warnings. Please review the updated " "content below before continuing: %(messages)s" msgstr "" "HTML验证产生 %(count)d 个警告。请在继续前查看下面更新的内容: %(messages)s" #: content/richtext/models.py:81 content/section/models.py:35 msgid "text" msgstr "纯文本" #: content/richtext/models.py:85 msgid "rich text" msgstr "富文本" #: content/richtext/models.py:86 msgid "rich texts" msgstr "富文本" #: content/rss/models.py:21 msgid "" "The rss field is updated several times a day. A change in the title will " "only be visible on the home page after the next feed update." msgstr "RSS字段一天内更新多次。标题改动将在feed更新后只在主页显示。" #: content/rss/models.py:22 msgid "link" msgstr "链接" #: content/rss/models.py:23 msgid "pre-rendered content" msgstr "预渲染的内容" #: content/rss/models.py:24 msgid "last updated" msgstr "最后更新" #: content/rss/models.py:25 msgid "max. items" msgstr "最大条目数" #: content/rss/models.py:29 msgid "RSS feed" msgstr "RSS 提要" #: content/rss/models.py:30 msgid "RSS feeds" msgstr "RSS 提要" #: content/section/models.py:41 msgid "section" msgstr "版块" #: content/section/models.py:42 msgid "sections" msgstr "版块" #: content/table/models.py:66 msgid "plain" msgstr "无格式" #: content/table/models.py:67 msgid "title row" msgstr "标题行" #: content/table/models.py:69 msgid "title row and column" msgstr "标题行和列" #: content/table/models.py:75 msgid "table" msgstr "表格" #: content/table/models.py:76 msgid "tables" msgstr "表格" #: content/table/models.py:90 msgid "data" msgstr "数据" #: content/template/models.py:51 msgid "template content" msgstr "模板内容" #: content/template/models.py:52 msgid "template contents" msgstr "模板内容" #: content/video/models.py:25 msgid "video link" msgstr "视频链接" #: content/video/models.py:26 msgid "" "This should be a link to a youtube or vimeo video, i.e.: http://www.youtube." "com/watch?v=zmj1rpzDRZ0" msgstr "" "请输入youtube或vimeo视频链接,比如:http://www.youtube.com/watch?" "v=zmj1rpzDRZ0" #: content/video/models.py:30 msgid "video" msgstr "视频" #: content/video/models.py:31 msgid "videos" msgstr "视频" #: contrib/tagging.py:117 msgid "Tagging" msgstr "" #: module/blog/models.py:28 msgid "published" msgstr "已发布" #: module/blog/models.py:30 msgid "This is used for the generated navigation too." msgstr "也被用于产生导航条" #: module/blog/models.py:33 msgid "published on" msgstr "发布于" #: module/blog/models.py:34 msgid "Will be set automatically once you tick the `published` checkbox above." msgstr "一旦你将`发表`复选框以上打勾选中,日志将设置成自动发布。" #: module/blog/models.py:39 msgid "entry" msgstr "条目" #: module/blog/models.py:40 msgid "entries" msgstr "条目" #: module/blog/extensions/tags.py:12 msgid "tags" msgstr "标签" #: module/blog/extensions/translations.py:20 #: module/extensions/translations.py:122 msgid "translation of" msgstr "翻译" #: module/blog/extensions/translations.py:23 #: module/extensions/translations.py:125 msgid "Leave this empty for entries in the primary language." msgstr "在主要语言项中对这些条目留空。" #: module/blog/extensions/translations.py:44 #: templates/admin/feincms/item_editor.html:43 msgid "available translations" msgstr "已有翻译" #: module/extensions/changedate.py:32 msgid "creation date" msgstr "创建日期" #: module/extensions/changedate.py:33 msgid "modification date" msgstr "修改日期" #: module/extensions/ct_tracker.py:136 msgid "content types" msgstr "内容类型" #: module/extensions/datepublisher.py:49 msgid "publication date" msgstr "发布起始日期" #: module/extensions/datepublisher.py:51 msgid "publication end date" msgstr "发布结束日期" #: module/extensions/datepublisher.py:53 msgid "Leave empty if the entry should stay active forever." msgstr "如果条目要永久显示,请留空" #: module/extensions/datepublisher.py:80 msgid "visible from - to" msgstr "可查看日期" #: module/extensions/datepublisher.py:90 msgid "Date-based publishing" msgstr "发布基于日期控制" #: module/extensions/featured.py:9 msgid "featured" msgstr "特性" #: module/extensions/featured.py:14 msgid "Featured" msgstr "特性" #: module/extensions/seo.py:9 msgid "meta keywords" msgstr "meta 关键词" #: module/extensions/seo.py:10 msgid "This will be prepended to the default keyword list." msgstr "这将作为默认的关键字列表被添加。" #: module/extensions/seo.py:11 msgid "meta description" msgstr "meta 描述" #: module/extensions/seo.py:12 msgid "This will be prepended to the default description." msgstr "这将作为默认的描述被添加" #: module/extensions/seo.py:18 msgid "Search engine optimization" msgstr "搜索引擎优化" #: module/extensions/translations.py:192 msgid "Edit translation" msgstr "编辑翻译" #: module/extensions/translations.py:195 msgid "Create translation" msgstr "创建翻译" #: module/extensions/translations.py:200 msgid "translations" msgstr "翻译" #: module/medialibrary/forms.py:26 msgid "This would create a loop in the hierarchy" msgstr "" #: module/medialibrary/forms.py:64 #, python-format msgid "" "Cannot overwrite with different file type (attempt to overwrite a " "%(old_ext)s with a %(new_ext)s)" msgstr "" #: module/medialibrary/modeladmins.py:57 #, python-format msgid "Successfully added %(count)d media file to %(category)s." msgid_plural "Successfully added %(count)d media files to %(category)s." msgstr[0] "Successfully added %(count)d media files to %(category)s." #: module/medialibrary/modeladmins.py:75 msgid "Add selected media files to category" msgstr "所选的媒体文件添加到类" #: module/medialibrary/modeladmins.py:84 #, python-format msgid "ZIP file exported as %s" msgstr "" #: module/medialibrary/modeladmins.py:86 #, python-format msgid "ZIP file export failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:91 msgid "Export selected media files as zip file" msgstr "" #: module/medialibrary/modeladmins.py:134 #: templates/admin/feincms/page/page/item_editor.html:15 msgid "Preview" msgstr "预览" #: module/medialibrary/modeladmins.py:139 module/medialibrary/models.py:88 msgid "file size" msgstr "文件大小" #: module/medialibrary/modeladmins.py:144 module/medialibrary/models.py:86 msgid "created" msgstr "创建" #: module/medialibrary/modeladmins.py:163 module/medialibrary/models.py:85 msgid "file type" msgstr "文件类型" #: module/medialibrary/modeladmins.py:184 msgid "file info" msgstr "文件信息" #: module/medialibrary/modeladmins.py:196 #, python-format msgid "%d files imported" msgstr "导入 %d 个文件" #: module/medialibrary/modeladmins.py:198 #, python-format msgid "ZIP import failed: %s" msgstr "" #: module/medialibrary/modeladmins.py:200 msgid "No input file given" msgstr "没有选择文件" #: module/medialibrary/models.py:43 msgid "parent" msgstr "父" #: module/medialibrary/models.py:45 module/page/models.py:142 msgid "slug" msgstr "slug" #: module/medialibrary/models.py:49 msgid "category" msgstr "类别" #: module/medialibrary/models.py:50 module/medialibrary/models.py:90 msgid "categories" msgstr "类别" #: module/medialibrary/models.py:87 msgid "copyright" msgstr "版权" #: module/medialibrary/models.py:202 msgid "Image" msgstr "图片" #: module/medialibrary/models.py:203 msgid "Video" msgstr "视频" #: module/medialibrary/models.py:204 msgid "Audio" msgstr "音频" #: module/medialibrary/models.py:205 msgid "PDF document" msgstr "PDF文档" #: module/medialibrary/models.py:206 msgid "Flash" msgstr "Flash" #: module/medialibrary/models.py:207 msgid "Text" msgstr "纯文本" #: module/medialibrary/models.py:208 msgid "Rich Text" msgstr "富文本" #: module/medialibrary/models.py:209 msgid "Zip archive" msgstr "zip压缩包" #: module/medialibrary/models.py:210 msgid "Microsoft Word" msgstr "Microsoft Word" #: module/medialibrary/models.py:211 msgid "Microsoft Excel" msgstr "Microsoft Excel" #: module/medialibrary/models.py:212 msgid "Microsoft PowerPoint" msgstr "Microsoft PowerPoint" #: module/medialibrary/models.py:213 msgid "Binary" msgstr "二进制文件" #: module/medialibrary/models.py:236 msgid "description" msgstr "描述" #: module/medialibrary/models.py:239 msgid "media file translation" msgstr "媒体文件翻译" #: module/medialibrary/models.py:240 msgid "media file translations" msgstr "媒体文件翻译" #: module/page/forms.py:118 msgid "This URL is already taken by an active page." msgstr "此URL已被其他页面使用" #: module/page/forms.py:136 msgid "This URL is already taken by another active page." msgstr "此URL已被另一个页面使用" #: module/page/modeladmins.py:41 msgid "Other options" msgstr "其他选项" #: module/page/modeladmins.py:89 module/page/models.py:145 msgid "in navigation" msgstr "导航中" #: module/page/modeladmins.py:100 msgid "Add child page" msgstr "增加子页面" #: module/page/modeladmins.py:102 #: templates/admin/feincms/content_inline.html:9 msgid "View on site" msgstr "站内查看" #: module/page/modeladmins.py:130 msgid "" "The content from the original translation has been copied to the newly " "created page." msgstr "" #: module/page/modeladmins.py:144 msgid "You don't have the necessary permissions to edit this object" msgstr "你无权编辑该对象" #: module/page/modeladmins.py:159 msgid "inherited" msgstr "继承" #: module/page/modeladmins.py:163 msgid "extensions" msgstr "扩展" #: module/page/modeladmins.py:167 module/page/models.py:179 msgid "is active" msgstr "激活" #: module/page/models.py:138 msgid "active" msgstr "激活" #: module/page/models.py:146 msgid "override URL" msgstr "URL覆盖" #: module/page/models.py:147 msgid "" "Override the target URL. Be sure to include slashes at the beginning and at " "the end if it is a local URL. This affects both the navigation and subpages' " "URLs." msgstr "" "覆盖目标URL,如果它是一个本地的URL,一定要包括在开始和结束时的斜线。这会影响" "导航和子页面的URL" #: module/page/models.py:148 msgid "redirect to" msgstr "转向" #: module/page/models.py:149 msgid "Target URL for automatic redirects." msgstr "转向目标URL" #: module/page/models.py:150 msgid "Cached URL" msgstr "URL缓存" #: module/page/models.py:161 msgid "page" msgstr "页面" #: module/page/models.py:162 msgid "pages" msgstr "页面" #: module/page/extensions/excerpt.py:9 msgid "excerpt" msgstr "摘抄" #: module/page/extensions/excerpt.py:10 msgid "Add a brief excerpt summarizing the content of this page." msgstr "添加一条简要形容页面内容" #: module/page/extensions/excerpt.py:12 msgid "Excerpt" msgstr "摘抄" #: module/page/extensions/navigation.py:80 #: module/page/extensions/navigation.py:100 msgid "navigation extension" msgstr "导航扩展" #: module/page/extensions/navigation.py:102 msgid "" "Select the module providing subpages for this page if you need to customize " "the navigation." msgstr "如果您需要定制的导航,选择提供此页面的子页面模块。" #: module/page/extensions/navigation.py:115 msgid "Navigation extension" msgstr "导航扩展" #: module/page/extensions/relatedpages.py:13 msgid "Select pages that should be listed as related content." msgstr "选择页面作为相关页面在列表中显示" #: module/page/extensions/relatedpages.py:20 msgid "Related pages" msgstr "相关页面" #: module/page/extensions/sites.py:16 msgid "Site" msgstr "网站" #: module/page/extensions/symlinks.py:15 msgid "symlinked page" msgstr "链接页面" #: module/page/extensions/symlinks.py:16 msgid "All content is inherited from this page if given." msgstr "所有内容继承于给出的页面" #: module/page/extensions/titles.py:13 msgid "content title" msgstr "内容标题" #: module/page/extensions/titles.py:14 msgid "The first line is the main title, the following lines are subtitles." msgstr "正文第一行作为主标题,第二行作为副标题" #: module/page/extensions/titles.py:15 msgid "page title" msgstr "页面标题" #: module/page/extensions/titles.py:16 msgid "Page title for browser window. Same as title by default." msgstr "浏览器窗口显示标题默认为页面标题" #: module/page/extensions/titles.py:43 msgid "Titles" msgstr "标题" #: templates/admin/filter.html:3 #, python-format msgid " By %(filter_title)s " msgstr "由 %(filter_title)s" #: templates/admin/content/mediafile/init.html:9 msgid "Search" msgstr "搜索" #: templates/admin/feincms/_messages_js.html:4 msgid "Really delete item?" msgstr "真的要删除?" #: templates/admin/feincms/_messages_js.html:4 msgid "Confirm to delete item" msgstr "确认删除" #: templates/admin/feincms/_messages_js.html:5 msgid "Item deleted successfully." msgstr "删除成功" #: templates/admin/feincms/_messages_js.html:5 msgid "Cannot delete item" msgstr "不能删除" #: templates/admin/feincms/_messages_js.html:6 msgid "Cannot delete item, because it is parent of at least one other item." msgstr "因为该项是其他的父级条目所以不能删除" #: templates/admin/feincms/_messages_js.html:7 msgid "Change template" msgstr "改变模板" #: templates/admin/feincms/_messages_js.html:8 msgid "Really change template?
    All changes are saved." msgstr "真的要修改模板么?
    全部修改已被保存。" #: templates/admin/feincms/_messages_js.html:9 #, fuzzy, python-format msgid "" "Really change template?
    All changes are saved and content from " "%%(source_regions)s is moved to %%(target_region)s." msgstr "" "真的修改模板?
    所有修改已保存,%(source_regions)s的内" "容已被移到%(target_region)s" #: templates/admin/feincms/_messages_js.html:12 msgid "Hide" msgstr "隐藏" #: templates/admin/feincms/_messages_js.html:13 msgid "Show" msgstr "显示" #: templates/admin/feincms/_messages_js.html:14 msgid "After" msgstr "之后" #: templates/admin/feincms/_messages_js.html:15 msgid "Before" msgstr "之前" #: templates/admin/feincms/_messages_js.html:16 msgid "Insert new:" msgstr "插入新的" #: templates/admin/feincms/content_editor.html:11 msgid "Region empty" msgstr "空区域" #: templates/admin/feincms/content_editor.html:15 msgid "" "Content from the parent site is automatically inherited. To override this " "behaviour, add some content." msgstr "父站的内容已自动继承。添加新内容会覆盖。" #: templates/admin/feincms/content_editor.html:23 msgid "Add new item" msgstr "新建" #: templates/admin/feincms/content_inline.html:91 #, python-format msgid "Add another %(verbose_name)s" msgstr "添加另一个 %(verbose_name)s" #: templates/admin/feincms/content_inline.html:94 msgid "Remove" msgstr "移除" #: templates/admin/feincms/fe_editor.html:40 msgid "Save" msgstr "保存" #: templates/admin/feincms/fe_tools.html:28 msgid "Stop Editing" msgstr "暂停编辑" #: templates/admin/feincms/fe_tools.html:33 msgid "edit" msgstr "编辑" #: templates/admin/feincms/fe_tools.html:35 msgid "new" msgstr "新建" #: templates/admin/feincms/fe_tools.html:36 msgid "up" msgstr "上" #: templates/admin/feincms/fe_tools.html:37 msgid "down" msgstr "下" #: templates/admin/feincms/fe_tools.html:38 msgid "remove" msgstr "移除" #: templates/admin/feincms/recover_form.html:8 #: templates/admin/feincms/revision_form.html:8 #: templates/admin/feincms/page/page/item_editor.html:23 #: templates/admin/feincms/page/page/tree_editor.html:7 msgid "Home" msgstr "首页" #: templates/admin/feincms/recover_form.html:11 #, python-format msgid "Recover deleted %(verbose_name)s" msgstr "Recover deleted %(verbose_name)s" #: templates/admin/feincms/recover_form.html:17 msgid "Press the save button below to recover this version of the object." msgstr "按下面的“保存”按钮恢复此对象的版本。" #: templates/admin/feincms/revision_form.html:12 msgid "History" msgstr "历史" #: templates/admin/feincms/revision_form.html:13 #, python-format msgid "Revert %(verbose_name)s" msgstr "Revert %(verbose_name)s" #: templates/admin/feincms/revision_form.html:24 msgid "Press the save button below to revert to this version of the object." msgstr "按下面的“保存”按钮,恢复到这个版本的对象。" #: templates/admin/feincms/tree_editor.html:32 msgid "Shortcuts" msgstr "快捷方式" #: templates/admin/feincms/tree_editor.html:34 msgid "Collapse tree" msgstr "折叠树型" #: templates/admin/feincms/tree_editor.html:35 msgid "Expand tree" msgstr "展开树型" #: templates/admin/feincms/tree_editor.html:38 msgid "Filter" msgstr "过滤器" #: templates/admin/feincms/page/page/item_editor.html:10 msgid "Edit on site" msgstr "站内编辑" #: templates/admin/feincms/page/page/item_editor.html:27 msgid "Add" msgstr "添加" #: templates/admin/medialibrary/add_to_category.html:5 #: templates/admin/medialibrary/add_to_category.html:9 msgid "Add media files to category" msgstr "添加媒体文件到分类" #: templates/admin/medialibrary/add_to_category.html:11 msgid "Select category to apply:" msgstr "选择申请类别:" #: templates/admin/medialibrary/add_to_category.html:17 msgid "The following media files will be added to the selected category:" msgstr "以下的媒体文件将被添加到选定的类别:" #: templates/admin/medialibrary/add_to_category.html:22 msgid "Add to category" msgstr "添加到分类" #: templates/admin/medialibrary/add_to_category.html:23 msgid "Cancel" msgstr "取消" #: templates/admin/medialibrary/mediafile/change_list.html:11 msgid "Bulk upload a ZIP file:" msgstr "批量上传zip文件" #: templates/admin/medialibrary/mediafile/change_list.html:21 msgid "Overwrite" msgstr "" #: templates/admin/medialibrary/mediafile/change_list.html:24 msgid "Send" msgstr "发送" #: templates/content/comments/default.html:10 #, python-format msgid "%(comment_count)s comments." msgstr "%(comment_count)s 条评论" #: templates/content/comments/default.html:18 #, python-format msgid "" "\n" " %(comment_username)s said on %(comment_submit_date)s
    \n" " " msgstr "" "\n" " %(comment_username)s 在 %(comment_submit_date)s 说
    \n" " " #: templates/content/comments/default.html:28 msgid "No comments." msgstr "无评论" #: templates/content/comments/default.html:36 msgid "Post Comment" msgstr "发表评论" #: templates/content/contactform/form.html:9 msgid "Submit" msgstr "提交" #: templates/content/contactform/thanks.html:3 msgid "Thanks!" msgstr "感谢" #~ msgid "Symlinked page" #~ msgstr "链接页面" feincms-1.7.4/feincms/management/000077500000000000000000000000001212255543400167125ustar00rootroot00000000000000feincms-1.7.4/feincms/management/__init__.py000066400000000000000000000000001212255543400210110ustar00rootroot00000000000000feincms-1.7.4/feincms/management/checker.py000066400000000000000000000037501212255543400206750ustar00rootroot00000000000000from django.core.management.color import color_style from django.db import connection def check_database_schema(cls, module_name): """ Returns a function which inspects the database table of the passed class. It checks whether all fields in the model are available on the database too. This is especially helpful for models with an extension mechanism, where the extension might be activated after syncdb has been run for the first time. Please note that you have to connect the return value using strong references. Here's an example how to do this:: signals.post_syncdb.connect(check_database_schema(Page, __name__), weak=False) (Yes, this is a weak attempt at a substitute for South until we find a way to make South work with FeinCMS' dynamic model creation.) """ def _fn(sender, **kwargs): if sender.__name__ != module_name: return cursor = connection.cursor() existing_columns = [row[0] for row in \ connection.introspection.get_table_description(cursor, cls._meta.db_table)] missing_columns = [] for field in cls._meta.fields: if field.column not in existing_columns: missing_columns.append(field) if not missing_columns: return style = color_style() print style.ERROR('The following columns seem to be missing in the database table %s:' % cls._meta.db_table) for field in missing_columns: print u'%s:%s%s' % ( style.SQL_KEYWORD(field.column), ' ' * (25 - len(field.column)), u'%s.%s' % (field.__class__.__module__, field.__class__.__name__), ) print style.NOTICE('\nPlease consult the output of `python manage.py sql %s` to' ' find out what the correct column types are. (Or use south, which is what' ' you should be doing anyway.)\n' % ( cls._meta.app_label, )) return _fn feincms-1.7.4/feincms/management/commands/000077500000000000000000000000001212255543400205135ustar00rootroot00000000000000feincms-1.7.4/feincms/management/commands/__init__.py000066400000000000000000000000001212255543400226120ustar00rootroot00000000000000feincms-1.7.4/feincms/management/commands/feincms_validate.py000066400000000000000000000031531212255543400243640ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ """ ``feincms_validate`` -------------------- ``feincms_validate`` checks your models for common pitfalls. """ from django.core.management.base import NoArgsCommand from django.core.management.color import color_style from django.db.models import loading class Command(NoArgsCommand): help = "Check models for common pitfalls." requires_model_validation = False def handle_noargs(self, **options): self.style = color_style() print "Running Django's own validation:" self.validate(display_num_errors=True) for model in loading.get_models(): if hasattr(model, '_create_content_base'): self.validate_base_model(model) if hasattr(model, '_feincms_content_models'): self.validate_content_type(model) def validate_base_model(self, model): """ Validate a subclass of ``feincms.models.Base`` or anything else created by ``feincms.models.create_base_model`` """ if not hasattr(model, 'template'): print self.style.NOTICE('%s has no template attribute; did you forget register_templates or register_regions?' % model) def validate_content_type(self, model): """ Validate a dynamically created concrete content type """ for base in model.__bases__: if not base._meta.abstract: print self.style.NOTICE('One of %s bases, %s, is not abstract' % (model, base))feincms-1.7.4/feincms/management/commands/rebuild_mptt.py000066400000000000000000000011661212255543400235630ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ """ ``rebuild_mptt`` --------------------- ``rebuild_mptt`` rebuilds your mptt pointers. Only use in emergencies. """ from django.core.management.base import NoArgsCommand from feincms.module.page.models import Page class Command(NoArgsCommand): help = "Run this manually to rebuild your mptt pointers. Only use in emergencies." def handle_noargs(self, **options): print "Rebuilding MPTT pointers for Page" Page._tree_manager.rebuild() feincms-1.7.4/feincms/management/commands/update_rsscontent.py000066400000000000000000000013661212255543400246370ustar00rootroot00000000000000""" ``update_rsscontent`` --------------------- ``update_rsscontent`` should be run as a cronjob when the ``RSSContent`` content type is used -- the content type itself does not update the feed by itself. """ from django.core.management.base import BaseCommand from feincms.content.rss.models import RSSContent class Command(BaseCommand): help = "Run this as a cronjob." def handle(self, date_format='', *args, **options): # find all concrete content types of RSSContent for cls in RSSContent._feincms_content_models: for content in cls.objects.all(): if date_format: content.cache_content(date_format=date_format) else: content.cache_content() feincms-1.7.4/feincms/models.py000066400000000000000000000746721212255543400164530ustar00rootroot00000000000000""" This is the core of FeinCMS All models defined here are abstract, which means no tables are created in the feincms\_ namespace. """ import sys import operator import warnings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ImproperlyConfigured from django.db import connections, models from django.db.models import Q from django.db.models.fields import FieldDoesNotExist from django.db.models.loading import get_model from django.forms.widgets import Media from django.template.loader import render_to_string from django.utils.datastructures import SortedDict from django.utils.encoding import force_unicode from django.utils.translation import ugettext_lazy as _ from feincms import ensure_completely_loaded from feincms.extensions import ExtensionsMixin from feincms.utils import copy_model_instance class Region(object): """ This class represents a region inside a template. Example regions might be 'main' and 'sidebar'. """ def __init__(self, key, title, *args): self.key = key self.title = title self.inherited = args and args[0] == 'inherited' or False self._content_types = [] def __unicode__(self): return force_unicode(self.title) @property def content_types(self): """ Returns a list of content types registered for this region as a list of (content type key, beautified content type name) tuples """ return [(ct.__name__.lower(), ct._meta.verbose_name) for ct in self._content_types] class Template(object): """ A template is a standard Django template which is used to render a CMS object, most commonly a page. """ def __init__(self, title, path, regions, key=None, preview_image=None): # The key is what will be stored in the database. If key is undefined # use the template path as fallback. if not key: key = path self.key = key self.title = title self.path = path self.preview_image = preview_image def _make_region(data): if isinstance(data, Region): return data return Region(*data) self.regions = [_make_region(row) for row in regions] self.regions_dict = dict((r.key, r) for r in self.regions) def __unicode__(self): return force_unicode(self.title) class ContentProxy(object): """ The ``ContentProxy`` is responsible for loading the content blocks for all regions (including content blocks in inherited regions) and assembling media definitions. The content inside a region can be fetched using attribute access with the region key. This is achieved through a custom ``__getattr__`` implementation. """ def __init__(self, item): item._needs_content_types() self.item = item self.db = item._state.db self._cache = { 'cts': {}, } def _inherit_from(self): """ Returns a list of item primary keys to try inheriting content from if a certain region is empty. Returns an ascending list of ancestors (using MPTT) by default. This is good enough (tm) for pages. """ return self.item.get_ancestors(ascending=True).values_list( 'pk', flat=True) def _fetch_content_type_counts(self): """ Returns a structure describing which content types exist for the object with the given primary key. The structure is as follows, where pk is the passed primary key and ct_idx are indices into the item._feincms_content_types list: { 'region_key': [ (pk, ct_idx1), (pk, ct_idx2), ], ... } """ if 'counts' not in self._cache: counts = self._fetch_content_type_count_helper(self.item.pk) empty_inherited_regions = set() for region in self.item.template.regions: if region.inherited and not counts.get(region.key): empty_inherited_regions.add(region.key) if empty_inherited_regions: for parent in self._inherit_from(): parent_counts = self._fetch_content_type_count_helper( parent, regions=tuple(empty_inherited_regions)) counts.update(parent_counts) for key in parent_counts.keys(): empty_inherited_regions.discard(key) if not empty_inherited_regions: break self._cache['counts'] = counts return self._cache['counts'] def _fetch_content_type_count_helper(self, pk, regions=None): tmpl = [ 'SELECT %d AS ct_idx, region, COUNT(id) FROM %s WHERE parent_id=%s' ] args = [] if regions: tmpl.append( 'AND region IN (' + ','.join(['%%s'] * len(regions)) + ')') args.extend(regions * len(self.item._feincms_content_types)) tmpl.append('GROUP BY region') tmpl = u' '.join(tmpl) sql = ' UNION '.join([tmpl % (idx, cls._meta.db_table, pk)\ for idx, cls in enumerate(self.item._feincms_content_types)]) sql = 'SELECT * FROM ( ' + sql + ' ) AS ct ORDER BY ct_idx' cursor = connections[self.db].cursor() cursor.execute(sql, args) _c = {} for ct_idx, region, count in cursor.fetchall(): if count: _c.setdefault(region, []).append((pk, ct_idx)) return _c def _popuplate_content_type_caches(self, types): """ Populate internal caches for all content types passed """ counts_by_type = {} for region, counts in self._fetch_content_type_counts().items(): for pk, ct_idx in counts: counts_by_type.setdefault( self.item._feincms_content_types[ct_idx], [], ).append((region, pk)) # Resolve abstract to concrete content types content_types = (cls for cls in self.item._feincms_content_types if issubclass(cls, tuple(types))) for cls in content_types: counts = counts_by_type.get(cls) if cls not in self._cache['cts']: if counts: self._cache['cts'][cls] = list(cls.get_queryset( reduce(operator.or_, ( Q(region=r[0], parent=r[1]) for r in counts)))) else: self._cache['cts'][cls] = [] def _fetch_regions(self): """ Fetches all content types and group content types into regions """ if 'regions' not in self._cache: self._popuplate_content_type_caches( self.item._feincms_content_types) contents = {} for cls, content_list in self._cache['cts'].items(): for instance in content_list: contents.setdefault(instance.region, []).append(instance) self._cache['regions'] = dict(( region, sorted(instances, key=lambda c: c.ordering), ) for region, instances in contents.iteritems()) return self._cache['regions'] def all_of_type(self, type_or_tuple): """ Returns all content type instances belonging to the type or types passed. If you want to filter for several types at the same time, type must be a tuple. The content type instances are sorted by their ``ordering`` value, but that isn't necessarily meaningful if the same content type exists in different regions. """ content_list = [] if not hasattr(type_or_tuple, '__iter__'): type_or_tuple = (type_or_tuple,) self._popuplate_content_type_caches(type_or_tuple) for type, contents in self._cache['cts'].items(): if any(issubclass(type, t) for t in type_or_tuple): content_list.extend(contents) return sorted(content_list, key=lambda c: c.ordering) def _get_media(self): """ Collect the media files of all content types of the current object """ if 'media' not in self._cache: media = Media() for contents in self._fetch_regions().values(): for content in contents: if hasattr(content, 'media'): media = media + content.media self._cache['media'] = media return self._cache['media'] media = property(_get_media) def __getattr__(self, attr): """ Get all item content instances for the specified item and region If no item contents could be found for the current item and the region has the inherited flag set, this method will go up the ancestor chain until either some item contents have found or no ancestors are left. """ if (attr.startswith('__')): raise AttributeError # Do not trigger loading of real content type models if not necessary if not self._fetch_content_type_counts().get(attr): return [] return self._fetch_regions().get(attr, []) def create_base_model(inherit_from=models.Model): """ This method can be used to create a FeinCMS base model inheriting from your own custom subclass (f.e. extend ``MPTTModel``). The default is to extend :class:`django.db.models.Model`. """ class Base(inherit_from, ExtensionsMixin): """ This is the base class for your CMS models. It knows how to create and manage content types. """ class Meta: abstract = True _cached_django_content_type = None @classmethod def register_regions(cls, *regions): """ Register a list of regions. Only use this if you do not want to use multiple templates with this model (read: not use ``register_templates``):: BlogEntry.register_regions( ('main', _('Main content area')), ) """ if hasattr(cls, 'template'): warnings.warn( 'Ignoring second call to register_regions.', RuntimeWarning) return # implicitly creates a dummy template object -- the item editor # depends on the presence of a template. cls.template = Template('', '', regions) cls._feincms_all_regions = cls.template.regions @classmethod def register_templates(cls, *templates): """ Register templates and add a ``template_key`` field to the model for saving the selected template:: Page.register_templates({ 'key': 'base', 'title': _('Standard template'), 'path': 'feincms_base.html', 'regions': ( ('main', _('Main content area')), ('sidebar', _('Sidebar'), 'inherited'), ), }, { 'key': '2col', 'title': _('Template with two columns'), 'path': 'feincms_2col.html', 'regions': ( ('col1', _('Column one')), ('col2', _('Column two')), ('sidebar', _('Sidebar'), 'inherited'), ), }) """ if not hasattr(cls, '_feincms_templates'): cls._feincms_templates = SortedDict() cls.TEMPLATES_CHOICES = [] instances = cls._feincms_templates for template in templates: if not isinstance(template, Template): template = Template(**template) instances[template.key] = template try: field = cls._meta.get_field_by_name('template_key')[0] except (FieldDoesNotExist, IndexError): cls.add_to_class('template_key', models.CharField(_('template'), max_length=255, choices=()) ) field = cls._meta.get_field_by_name('template_key')[0] def _template(self): ensure_completely_loaded() try: return self._feincms_templates[self.template_key] except KeyError: # return first template as a fallback if the template # has changed in-between return self._feincms_templates[ self._feincms_templates.keys()[0]] cls.template = property(_template) cls.TEMPLATE_CHOICES = field._choices = [( template.key, template.title, ) for template in cls._feincms_templates.values()] field.default = field.choices[0][0] # Build a set of all regions used anywhere cls._feincms_all_regions = set() for template in cls._feincms_templates.values(): cls._feincms_all_regions.update(template.regions) #: ``ContentProxy`` class this object uses to collect content blocks content_proxy_class = ContentProxy @property def content(self): """ Instantiate and return a ``ContentProxy``. You can use your own custom ``ContentProxy`` by assigning a different class to the ``content_proxy_class`` member variable. """ if not hasattr(self, '_content_proxy'): self._content_proxy = self.content_proxy_class(self) return self._content_proxy @classmethod def _create_content_base(cls): """ This is purely an internal method. Here, we create a base class for the concrete content types, which are built in ``create_content_type``. The three fields added to build a concrete content type class/model are ``parent``, ``region`` and ``ordering``. """ # We need a template, because of the possibility of restricting # content types to a subset of all available regions. Each region # object carries a list of all allowed content types around. # Content types created before a region is initialized would not be # available in the respective region; we avoid this problem by # raising an ImproperlyConfigured exception early. cls._needs_templates() class Meta: abstract = True app_label = cls._meta.app_label ordering = ['ordering'] def __unicode__(self): return u'%s on %s, ordering %s' % ( self.region, self.parent, self.ordering) def render(self, **kwargs): """ Default render implementation, tries to call a method named after the region key before giving up. You'll probably override the render method itself most of the time instead of adding region-specific render methods. """ render_fn = getattr(self, 'render_%s' % self.region, None) if render_fn: return render_fn(**kwargs) raise NotImplementedError def fe_render(self, **kwargs): """ Frontend Editing enabled renderer """ if 'request' in kwargs: request = kwargs['request'] if (hasattr(request, 'COOKIES') and request.COOKIES.get('frontend_editing')): return render_to_string('admin/feincms/fe_box.html', { 'content': self.render(**kwargs), 'identifier': self.fe_identifier(), }) return self.render(**kwargs) def fe_identifier(self): """ Returns an identifier which is understood by the frontend editing javascript code. (It is used to find the URL which should be used to load the form for every given block of content.) """ return u'%s-%s-%s-%s-%s' % ( cls._meta.app_label, cls._meta.module_name, self.__class__.__name__.lower(), self.parent_id, self.id, ) def get_queryset(cls, filter_args): return cls.objects.select_related().filter(filter_args) attrs = { # The basic content type is put into # the same module as the CMS base type. # If an app_label is not given, Django # needs to know where a model comes # from, therefore we ensure that the # module is always known. '__module__': cls.__module__, '__unicode__': __unicode__, 'render': render, 'fe_render': fe_render, 'fe_identifier': fe_identifier, 'get_queryset': classmethod(get_queryset), 'Meta': Meta, 'parent': models.ForeignKey(cls, related_name='%(class)s_set'), 'region': models.CharField(max_length=255), 'ordering': models.IntegerField(_('ordering'), default=0), } # create content base type and save reference on CMS class name = '_Internal%sContentTypeBase' % cls.__name__ if hasattr(sys.modules[cls.__module__], name): warnings.warn( 'The class %s.%s has the same name as the class that ' 'FeinCMS auto-generates based on %s.%s. To avoid database' 'errors and import clashes, rename one of these classes.' % (cls.__module__, name, cls.__module__, cls.__name__), RuntimeWarning) cls._feincms_content_model = type(name, (models.Model,), attrs) # list of concrete content types cls._feincms_content_types = [] # list of concrete content types having methods which may be called # before or after rendering the content: # # def process(self, request, **kwargs): # May return a response early to short-circuit the # request-response cycle # # def finalize(self, request, response) # May modify the response or replace it entirely by returning # a new one # cls._feincms_content_types_with_process = [] cls._feincms_content_types_with_finalize = [] # list of item editor context processors, will be extended by # content types if hasattr(cls, 'feincms_item_editor_context_processors'): cls.feincms_item_editor_context_processors = list( cls.feincms_item_editor_context_processors) else: cls.feincms_item_editor_context_processors = [] # list of templates which should be included in the item editor, # will be extended by content types if hasattr(cls, 'feincms_item_editor_includes'): cls.feincms_item_editor_includes = dict( cls.feincms_item_editor_includes) else: cls.feincms_item_editor_includes = {} @classmethod def create_content_type(cls, model, regions=None, class_name=None, **kwargs): """ This is the method you'll use to create concrete content types. If the CMS base class is ``page.models.Page``, its database table will be ``page_page``. A concrete content type which is created from ``ImageContent`` will use ``page_page_imagecontent`` as its table. If you want a content type only available in a subset of regions, you can pass a list/tuple of region keys as ``regions``. The content type will only appear in the corresponding tabs in the item editor. If you use two content types with the same name in the same module, name clashes will happen and the content type created first will shadow all subsequent content types. You can work around it by specifying the content type class name using the ``class_name`` argument. Please note that this will have an effect on the entries in ``django_content_type``, on ``related_name`` and on the table name used and should therefore not be changed after running ``syncdb`` for the first time. Name clashes will also happen if a content type has defined a relationship and you try to register that content type to more than one Base model (in different modules). Django will raise an error when it tries to create the backward relationship. The solution to that problem is, as shown above, to specify the content type class name with the ``class_name`` argument. If you register a content type to more than one Base class, it is recommended to always specify a ``class_name`` when registering it a second time. You can pass additional keyword arguments to this factory function. These keyword arguments will be passed on to the concrete content type, provided that it has a ``initialize_type`` classmethod. This is used f.e. in ``MediaFileContent`` to pass a set of possible media positions (f.e. left, right, centered) through to the content type. """ if not class_name: class_name = model.__name__ # prevent double registration and registration of two different # content types with the same class name because of related_name # clashes try: getattr(cls, '%s_set' % class_name.lower()) warnings.warn( 'Cannot create content type using %s.%s for %s.%s,' ' because %s_set is already taken.' % ( model.__module__, class_name, cls.__module__, cls.__name__, class_name.lower()), RuntimeWarning) return except AttributeError: # everything ok pass # Next name clash test. Happens when the same content type is # created for two Base subclasses living in the same Django # application (github issues #73 and #150) other_model = get_model(cls._meta.app_label, class_name) if other_model: warnings.warn( 'It seems that the content type %s exists twice in %s.' ' Use the class_name argument to create_content_type to' ' avoid this error.' % ( model.__name__, cls._meta.app_label), RuntimeWarning) if not model._meta.abstract: raise ImproperlyConfigured('Cannot create content type from' ' non-abstract model (yet).') if not hasattr(cls, '_feincms_content_model'): cls._create_content_base() feincms_content_base = cls._feincms_content_model class Meta(feincms_content_base.Meta): db_table = '%s_%s' % (cls._meta.db_table, class_name.lower()) verbose_name = model._meta.verbose_name verbose_name_plural = model._meta.verbose_name_plural attrs = { # put the concrete content type into the # same module as the CMS base type; this is # necessary because 1. Django needs to know # the module where a model lives and 2. a # content type may be used by several CMS # base models at the same time (f.e. in # the blog and the page module). '__module__': cls.__module__, 'Meta': Meta, } new_type = type( class_name, (model, feincms_content_base,), attrs) cls._feincms_content_types.append(new_type) if hasattr(getattr(new_type, 'process', None), '__call__'): cls._feincms_content_types_with_process.append(new_type) if hasattr(getattr(new_type, 'finalize', None), '__call__'): cls._feincms_content_types_with_finalize.append(new_type) # content types can be limited to a subset of regions if not regions: regions = set([region.key for region in cls._feincms_all_regions]) for region in cls._feincms_all_regions: if region.key in regions: region._content_types.append(new_type) # Add a list of CMS base types for which a concrete content type # has been created to the abstract content type. This is needed # f.e. for the update_rsscontent management command, which needs to # find all concrete RSSContent types, so that the RSS feeds can be # fetched if not hasattr(model, '_feincms_content_models'): model._feincms_content_models = [] model._feincms_content_models.append(new_type) # Add a backlink from content-type to content holder class new_type._feincms_content_class = cls # Handle optgroup argument for grouping content types in the item # editor optgroup = kwargs.pop('optgroup', None) if optgroup: new_type.optgroup = optgroup # customization hook. if hasattr(new_type, 'initialize_type'): new_type.initialize_type(**kwargs) else: for k, v in kwargs.items(): setattr(new_type, k, v) # collect item editor context processors from the content type if hasattr(model, 'feincms_item_editor_context_processors'): cls.feincms_item_editor_context_processors.extend( model.feincms_item_editor_context_processors) # collect item editor includes from the content type if hasattr(model, 'feincms_item_editor_includes'): for key, incls in model.feincms_item_editor_includes.items(): cls.feincms_item_editor_includes.setdefault( key, set()).update(incls) ensure_completely_loaded(force=True) return new_type @property def _django_content_type(self): if not getattr(self, '_cached_django_content_type', None): self.__class__._cached_django_content_type = ( ContentType.objects.get_for_model(self)) return self.__class__._cached_django_content_type @classmethod def content_type_for(cls, model): """ Return the concrete content type for an abstract content type:: from feincms.content.video.models import VideoContent concrete_type = Page.content_type_for(VideoContent) """ if (not hasattr(cls, '_feincms_content_types') or not cls._feincms_content_types): return None for type in cls._feincms_content_types: if issubclass(type, model): if type.__base__ is model: return type return None @classmethod def _needs_templates(cls): ensure_completely_loaded() # helper which can be used to ensure that either register_regions # or register_templates has been executed before proceeding if not hasattr(cls, 'template'): raise ImproperlyConfigured('You need to register at least one' ' template or one region on %s.' % cls.__name__) @classmethod def _needs_content_types(cls): ensure_completely_loaded() # Check whether any content types have been created for this base # class if (not hasattr(cls, '_feincms_content_types') or not cls._feincms_content_types): raise ImproperlyConfigured('You need to create at least one' ' content type for the %s model.' % cls.__name__) def copy_content_from(self, obj): """ Copy all content blocks over to another CMS base object. (Must be of the same type, but this is not enforced. It will crash if you try to copy content from another CMS base type.) """ for cls in self._feincms_content_types: for content in cls.objects.filter(parent=obj): new = copy_model_instance(content, exclude=('id', 'parent')) new.parent = self new.save() def replace_content_with(self, obj): """ Replace the content of the current object with content of another. Deletes all content blocks and calls ``copy_content_from`` afterwards. """ for cls in self._feincms_content_types: cls.objects.filter(parent=self).delete() self.copy_content_from(obj) @classmethod def register_with_reversion(cls): try: import reversion except ImportError: raise EnvironmentError("django-reversion is not installed") follow = [] for content_type in cls._feincms_content_types: follow.append('%s_set' % content_type.__name__.lower()) reversion.register(content_type) reversion.register(cls, follow=follow) return Base # Legacy support Base = create_base_model() feincms-1.7.4/feincms/module/000077500000000000000000000000001212255543400160635ustar00rootroot00000000000000feincms-1.7.4/feincms/module/__init__.py000066400000000000000000000000001212255543400201620ustar00rootroot00000000000000feincms-1.7.4/feincms/module/blog/000077500000000000000000000000001212255543400170065ustar00rootroot00000000000000feincms-1.7.4/feincms/module/blog/__init__.py000066400000000000000000000000001212255543400211050ustar00rootroot00000000000000feincms-1.7.4/feincms/module/blog/admin.py000066400000000000000000000002041212255543400204440ustar00rootroot00000000000000from django.contrib import admin from feincms.module.blog.models import Entry, EntryAdmin admin.site.register(Entry, EntryAdmin) feincms-1.7.4/feincms/module/blog/extensions/000077500000000000000000000000001212255543400212055ustar00rootroot00000000000000feincms-1.7.4/feincms/module/blog/extensions/__init__.py000066400000000000000000000000001212255543400233040ustar00rootroot00000000000000feincms-1.7.4/feincms/module/blog/extensions/tags.py000066400000000000000000000006671212255543400225260ustar00rootroot00000000000000""" Simple tagging support using ``django-tagging``. """ from django.utils.translation import ugettext_lazy as _ import tagging from tagging.fields import TagField def register(cls, admin_cls): cls.add_to_class('tags', TagField(_('tags'))) # use another name for the tag descriptor # See http://code.google.com/p/django-tagging/issues/detail?id=95 for the reason why tagging.register(cls, tag_descriptor_attr='etags') feincms-1.7.4/feincms/module/blog/extensions/translations.py000066400000000000000000000037151212255543400243060ustar00rootroot00000000000000""" This extension adds a language field to every blog entry. Blog entries in secondary languages can be said to be a translation of a blog entry in the primary language (the first language in settings.LANGUAGES), thereby enabling deeplinks between translated blog entries. """ from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ def register(cls, admin_cls): primary_language = settings.LANGUAGES[0][0] cls.add_to_class('language', models.CharField(_('language'), max_length=10, choices=settings.LANGUAGES)) cls.add_to_class('translation_of', models.ForeignKey('self', blank=True, null=True, verbose_name=_('translation of'), related_name='translations', limit_choices_to={'language': primary_language}, help_text=_('Leave this empty for entries in the primary language.') )) def available_translations(self): if self.language == primary_language: return self.translations.all() elif self.translation_of: return [self.translation_of] + list(self.translation_of.translations.exclude( language=self.language)) else: return [] cls.available_translations = available_translations def available_translations_admin(self): translations = self.available_translations() return u', '.join( u'%s' % (page.id, page.language.upper()) for page in translations) available_translations_admin.allow_tags = True available_translations_admin.short_description = _('available translations') cls.available_translations_admin = available_translations_admin if getattr(admin_cls, 'fieldsets'): admin_cls.fieldsets[0][1]['fields'].extend(['language']) admin_cls.list_display += ('language', 'available_translations_admin') admin_cls.list_filter += ('language',) admin_cls.raw_id_fields.append('translation_of') feincms-1.7.4/feincms/module/blog/models.py000066400000000000000000000040341212255543400206440ustar00rootroot00000000000000""" This is more a proof-of-concept for your own :class:`feincms.module.Base` subclasses than a polished or even sufficient blog module implementation. It does work, though. """ from django.db import models from django.db.models import signals from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from feincms.admin import item_editor from feincms.management.checker import check_database_schema from feincms.models import Base class EntryManager(models.Manager): def published(self): return self.filter( published=True, published_on__isnull=False, published_on__lte=timezone.now(), ) class Entry(Base): published = models.BooleanField(_('published'), default=False) title = models.CharField(_('title'), max_length=100, help_text=_('This is used for the generated navigation too.')) slug = models.SlugField() published_on = models.DateTimeField(_('published on'), blank=True, null=True, help_text=_('Will be set automatically once you tick the `published` checkbox above.')) class Meta: get_latest_by = 'published_on' ordering = ['-published_on'] verbose_name = _('entry') verbose_name_plural = _('entries') objects = EntryManager() def __unicode__(self): return self.title def save(self, *args, **kwargs): if self.published and not self.published_on: self.published_on = timezone.now() super(Entry, self).save(*args, **kwargs) save.alters_data = True @models.permalink def get_absolute_url(self): return ('blog_entry_detail', (self.id,), {}) signals.post_syncdb.connect(check_database_schema(Entry, __name__), weak=False) class EntryAdmin(item_editor.ItemEditor): date_hierarchy = 'published_on' list_display = ['__unicode__', 'published', 'published_on'] list_filter = ['published',] search_fields = ['title', 'slug'] prepopulated_fields = { 'slug': ('title',), } raw_id_fields = [] feincms-1.7.4/feincms/module/extensions/000077500000000000000000000000001212255543400202625ustar00rootroot00000000000000feincms-1.7.4/feincms/module/extensions/__init__.py000066400000000000000000000000001212255543400223610ustar00rootroot00000000000000feincms-1.7.4/feincms/module/extensions/changedate.py000066400000000000000000000043071212255543400227230ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ """ Track the modification date for objects. """ from email.utils import parsedate_tz, mktime_tz from django.db import models from django.db.models.signals import pre_save from django.utils import timezone from django.utils.translation import ugettext_lazy as _ # ------------------------------------------------------------------------ def pre_save_handler(sender, instance, **kwargs): """ Intercept attempts to save and insert the current date and time into creation and modification date fields. """ now = timezone.now() if instance.id is None: instance.creation_date = now instance.modification_date = now # ------------------------------------------------------------------------ def dt_to_utc_timestamp(dt): from time import mktime return int(mktime(dt.timetuple())) def register(cls, admin_cls): cls.add_to_class('creation_date', models.DateTimeField(_('creation date'), null=True, editable=False)) cls.add_to_class('modification_date', models.DateTimeField(_('modification date'), null=True, editable=False)) if hasattr(cls, 'cache_key_components'): cls.cache_key_components.append(lambda page: page.modification_date and str(dt_to_utc_timestamp(page.modification_date))) cls.last_modified = lambda p: p.modification_date pre_save.connect(pre_save_handler, sender=cls) # ------------------------------------------------------------------------ def last_modified_response_processor(page, request, response): from django.utils.http import http_date # Don't include Last-Modified if we don't want to be cached if "no-cache" in response.get('Cache-Control', ''): return # If we already have a Last-Modified, take the later one last_modified = dt_to_utc_timestamp(page.last_modified()) if response.has_header('Last-Modified'): last_modified = max(last_modified, mktime_tz(parsedate_tz(response['Last-Modified']))) response['Last-Modified'] = http_date(last_modified) # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/extensions/ct_tracker.py000066400000000000000000000135101212255543400227550ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ # # ct_tracker.py # FeinCMS # # Created by Martin J. Laubach on 02.10.09. # Copyright (c) 2009 Martin J. Laubach. All rights reserved. # Updated in 2011 by Matthias Kestenholz for the 1.3 release. # # ------------------------------------------------------------------------ """ Track the content types for pages. Instead of gathering the content types present in each page at run time, save the current state at saving time, thus saving at least one DB query on page delivery. """ from django.contrib.contenttypes.models import ContentType from django.db.models.signals import class_prepared, post_save, pre_save from django.utils.translation import ugettext_lazy as _ from feincms.contrib.fields import JSONField from feincms.models import ContentProxy INVENTORY_VERSION = 1 _translation_map_cache = {} # ------------------------------------------------------------------------ class TrackerContentProxy(ContentProxy): def _fetch_content_type_counts(self): """ If an object with an empty _ct_inventory is encountered, compute all the content types currently used on that object and save the list in the object itself. Further requests for that object can then access that information and find out which content types are used without resorting to multiple selects on different ct tables. It is therefore important that even an "empty" object does not have an empty _ct_inventory. """ if 'counts' not in self._cache: if self.item._ct_inventory and \ self.item._ct_inventory.get('_version_', -1) == INVENTORY_VERSION: try: self._cache['counts'] = self._from_inventory(self.item._ct_inventory) except KeyError: # It's possible that the inventory does not fit together with the # current models anymore, f.e. because a content type has been # removed. pass if 'counts' not in self._cache: super(TrackerContentProxy, self)._fetch_content_type_counts() self.item._ct_inventory = self._to_inventory(self._cache['counts']) self.item.invalidate_cache() self.item.__class__.objects.filter(id=self.item.id).update( _ct_inventory=self.item._ct_inventory) # Run post save handler by hand if hasattr(self.item, 'get_descendants'): self.item.get_descendants(include_self=False).update(_ct_inventory=None) return self._cache['counts'] def _translation_map(self): cls = self.item.__class__ if not cls in _translation_map_cache: # Prime translation map and cache it in the class. This needs to be # done late as opposed to at class definition time as not all information # is ready, especially when we are doing a "syncdb" the ContentType table # does not yet exist map = {} for idx, fct in enumerate(self.item._feincms_content_types): dct = ContentType.objects.get_for_model(fct) # Rely on non-negative primary keys map[-dct.id] = idx # From-inventory map map[idx] = dct.id # To-inventory map _translation_map_cache[cls] = map return _translation_map_cache[cls] def _from_inventory(self, inventory): """ Transforms the inventory from Django's content types to FeinCMS's ContentProxy counts format. """ map = self._translation_map() return dict((region, [ (pk, map[-ct]) for pk, ct in items ]) for region, items in inventory.items() if region!='_version_') def _to_inventory(self, counts): map = self._translation_map() inventory = dict((region, [ (pk, map[ct]) for pk, ct in items ]) for region, items in counts.items()) inventory['_version_'] = INVENTORY_VERSION return inventory # ------------------------------------------------------------------------ def class_prepared_handler(sender, **kwargs): # It might happen under rare circumstances that not all model classes # are fully loaded and initialized when the translation map is accessed. # This leads to (lots of) crashes on the server. Better be safe and # kill the translation map when any class_prepared signal is received. global _translation_map_cache _translation_map_cache = {} class_prepared.connect(class_prepared_handler) # ------------------------------------------------------------------------ def tree_post_save_handler(sender, instance, **kwargs): """ Clobber the _ct_inventory attribute of this object and all sub-objects on save. """ # TODO: Does not find everything it should when ContentProxy content # inheritance has been customized. instance.get_descendants(include_self=True).update(_ct_inventory=None) # ------------------------------------------------------------------------ def single_pre_save_handler(sender, instance, **kwargs): """Clobber the _ct_inventory attribute of this object""" instance._ct_inventory = None # ------------------------------------------------------------------------ def register(cls, admin_cls): cls.add_to_class('_ct_inventory', JSONField(_('content types'), editable=False, blank=True, null=True)) cls.content_proxy_class = TrackerContentProxy pre_save.connect(single_pre_save_handler, sender=cls) if hasattr(cls, 'get_descendants'): post_save.connect(tree_post_save_handler, sender=cls) # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/extensions/datepublisher.py000066400000000000000000000110301212255543400234620ustar00rootroot00000000000000""" Allows setting a date range for when the page is active. Modifies the active() manager method so that only pages inside the given range are used in the default views and the template tags. Depends on the page class having a "active_filters" list that will be used by the page's manager to determine which entries are to be considered active. """ # ------------------------------------------------------------------------ from datetime import datetime from django.db import models from django.db.models import Q from django.utils import timezone from django.utils.cache import patch_response_headers from django.utils.translation import ugettext_lazy as _ # ------------------------------------------------------------------------ def format_date(d, if_none=''): """ Format a date in a nice human readable way: Omit the year if it's the current year. Also return a default value if no date is passed in. """ if d is None: return if_none now = timezone.now() fmt = (d.year == now.year) and '%d.%m' or '%d.%m.%Y' return d.strftime(fmt) def latest_children(self): return self.get_children().order_by('-publication_date') # ------------------------------------------------------------------------ def granular_now(n=None): """ A datetime.now look-alike that returns times rounded to a five minute boundary. This helps the backend database to optimize/reuse/cache its queries by not creating a brand new query each time. Also useful if you are using johnny-cache or a similar queryset cache. """ if n is None: n = timezone.now() return timezone.make_aware(datetime(n.year, n.month, n.day, n.hour, (n.minute // 5) * 5), n.tzinfo) # ------------------------------------------------------------------------ def datepublisher_response_processor(page, request, response): """ This response processor is automatically added when the datepublisher extension is registered. It sets the response headers to match with the publication end date of the page so that upstream caches and the django caching middleware know when to expunge the copy. """ expires = page.publication_end_date if expires is not None: now = datetime.now() delta = int((expires - now).total_seconds()) patch_response_headers(response, delta) # ------------------------------------------------------------------------ def register(cls, admin_cls): cls.add_to_class('publication_date', models.DateTimeField(_('publication date'), default=granular_now)) cls.add_to_class('publication_end_date', models.DateTimeField(_('publication end date'), blank=True, null=True, help_text=_('Leave empty if the entry should stay active forever.'))) cls.add_to_class('latest_children', latest_children) # Patch in rounding the pub and pub_end dates on save orig_save = cls.save def granular_save(obj, *args, **kwargs): if obj.publication_date: obj.publication_date = granular_now(obj.publication_date) if obj.publication_end_date: obj.publication_end_date = granular_now(obj.publication_end_date) orig_save(obj, *args, **kwargs) cls.save = granular_save # Append publication date active check if hasattr(cls._default_manager, 'add_to_active_filters'): cls._default_manager.add_to_active_filters( Q(publication_date__lte=granular_now) & (Q(publication_end_date__isnull=True) | Q(publication_end_date__gt=granular_now)), key='datepublisher') # Processor to patch up response headers for expiry date cls.register_response_processor(datepublisher_response_processor) def datepublisher_admin(self, page): return u'%s – %s' % ( format_date(page.publication_date), format_date(page.publication_end_date, '∞'), ) datepublisher_admin.allow_tags = True datepublisher_admin.short_description = _('visible from - to') admin_cls.datepublisher_admin = datepublisher_admin try: pos = admin_cls.list_display.index('is_visible_admin') except ValueError: pos = len(admin_cls.list_display) admin_cls.list_display.insert(pos + 1, 'datepublisher_admin') admin_cls.add_extension_options(_('Date-based publishing'), { 'fields': ('publication_date', 'publication_end_date'), }) # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/extensions/featured.py000066400000000000000000000010031212255543400224250ustar00rootroot00000000000000""" Add a "featured" field to objects so admins can better direct top content. """ from django.db import models from django.utils.translation import ugettext_lazy as _ def register(cls, admin_cls): cls.add_to_class('featured', models.BooleanField(_('featured'))) if hasattr(cls, 'cache_key_components'): cls.cache_key_components.append(lambda page: page.featured) admin_cls.add_extension_options(_('Featured'), { 'fields': ('featured',), 'classes': ('collapse',), }) feincms-1.7.4/feincms/module/extensions/seo.py000066400000000000000000000014671212255543400214320ustar00rootroot00000000000000""" Add a keyword and a description field which are helpful for SEO optimization. """ from django.db import models from django.utils.translation import ugettext_lazy as _ def register(cls, admin_cls): cls.add_to_class('meta_keywords', models.TextField(_('meta keywords'), blank=True, help_text=_('This will be prepended to the default keyword list.'))) cls.add_to_class('meta_description', models.TextField(_('meta description'), blank=True, help_text=_('This will be prepended to the default description.'))) if admin_cls: admin_cls.search_fields.extend(['meta_keywords', 'meta_description']) admin_cls.add_extension_options(_('Search engine optimization'), { 'fields': ('meta_keywords', 'meta_description'), 'classes': ('collapse',), }) feincms-1.7.4/feincms/module/extensions/translations.py000066400000000000000000000227431212255543400233650ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ """ This extension adds a language field to every page. When calling the request processors the page's language is activated. Pages in secondary languages can be said to be a translation of a page in the primary language (the first language in settings.LANGUAGES), thereby enabling deeplinks between translated pages. It is recommended to activate :class:`django.middleware.locale.LocaleMiddleware` so that the correct language will be activated per user or session even for non-FeinCMS managed views such as Django's administration tool. """ # ------------------------------------------------------------------------ import logging from django.conf import settings as django_settings from django.db import models from django.http import HttpResponseRedirect from django.utils import translation from django.utils.translation import ugettext_lazy as _ from feincms import extensions, settings from feincms.translations import is_primary_language from feincms._internal import monkeypatch_method, monkeypatch_property # ------------------------------------------------------------------------ logger = logging.getLogger(__name__) # ------------------------------------------------------------------------ def user_has_language_set(request): """ Determine whether the user has explicitely set a language earlier on. This is taken later on as an indication that we should not mess with the site's language settings, after all, the user's decision is what counts. """ if hasattr(request, 'session') and request.session.get('django_language') is not None: return True if django_settings.LANGUAGE_COOKIE_NAME in request.COOKIES: return True return False # ------------------------------------------------------------------------ def translation_set_language(request, select_language): """ Set and activate a language, if that language is available. """ if translation.check_for_language(select_language): fallback = False else: # The page is in a language that Django has no messages for. # We display anyhow, but fall back to primary language for # other messages and other applications. It is *highly* recommended to # create a new django.po for the language instead of # using this behaviour. select_language = django_settings.LANGUAGES[0][0] fallback = True translation.activate(select_language) request.LANGUAGE_CODE = translation.get_language() if hasattr(request, 'session'): # User has a session, then set this language there if select_language != request.session.get('django_language'): request.session['django_language'] = select_language elif request.method == 'GET' and not fallback: # No session is active. We need to set a cookie for the language # so that it persists when the user changes his location to somewhere # not under the control of the CMS. # Only do this when request method is GET (mainly, do not abort # POST requests) response = HttpResponseRedirect(request.get_full_path()) response.set_cookie(django_settings.LANGUAGE_COOKIE_NAME, select_language) return response # ------------------------------------------------------------------------ def translations_request_processor_explicit(page, request): # If this page is just a redirect, don't do any language specific setup if page.redirect_to: return # Until further notice, the user might be wanting to switch to the # page's language... desired_language = page.language # ...except if the user explicitely wants to switch language if 'set_language' in request.GET: desired_language = request.GET['set_language'] # ...or the user already has explicitely set a language, bail out and # don't change it for him behind her back elif user_has_language_set(request): return return translation_set_language(request, desired_language) # ------------------------------------------------------------------------ def translations_request_processor_standard(page, request): # If this page is just a redirect, don't do any language specific setup if getattr(page, 'redirect_to', None): return if page.language == translation.get_language(): return return translation_set_language(request, page.language) # ------------------------------------------------------------------------ def get_current_language_code(request): language_code = getattr(request, 'LANGUAGE_CODE', None) if language_code is None: logger.warning("Could not access request.LANGUAGE_CODE. Is 'django.middleware.locale.LocaleMiddleware' in MIDDLEWARE_CLASSES?") return language_code # ------------------------------------------------------------------------ class Extension(extensions.Extension): def handle_model(self): cls = self.model cls.add_to_class('language', models.CharField(_('language'), max_length=10, choices=django_settings.LANGUAGES, default=django_settings.LANGUAGES[0][0])) cls.add_to_class('translation_of', models.ForeignKey('self', blank=True, null=True, verbose_name=_('translation of'), related_name='translations', limit_choices_to={'language': django_settings.LANGUAGES[0][0]}, help_text=_('Leave this empty for entries in the primary language.') )) if hasattr(cls, 'register_request_processor'): if settings.FEINCMS_TRANSLATION_POLICY == "EXPLICIT": cls.register_request_processor(translations_request_processor_explicit, key='translations') else: # STANDARD cls.register_request_processor(translations_request_processor_standard, key='translations') if hasattr(cls, 'get_redirect_to_target'): original_get_redirect_to_target = cls.get_redirect_to_target @monkeypatch_method(cls) def get_redirect_to_target(self, request): """ Find an acceptable redirect target. If this is a local link, then try to find the page this redirect references and translate it according to the user's language. This way, one can easily implement a localized "/"-url to welcome page redirection. """ target = original_get_redirect_to_target(self, request) if target and target.find('//') == -1: # Not an offsite link http://bla/blubb try: page = cls.objects.page_for_path(target) page = page.get_translation(get_current_language_code(request)) target = page.get_absolute_url() except cls.DoesNotExist: pass return target @monkeypatch_method(cls) def available_translations(self): if not self.id: # New, unsaved pages have no translations return [] if is_primary_language(self.language): return self.translations.all() elif self.translation_of: return [self.translation_of] + list(self.translation_of.translations.exclude( language=self.language)) else: return [] @monkeypatch_method(cls) def get_original_translation(self, *args, **kwargs): if is_primary_language(self.language): return self if self.translation_of: return self.translation_of raise self.DoesNotExist @monkeypatch_property(cls) def original_translation(self): return self.get_original_translation() @monkeypatch_method(cls) def get_translation(self, language): return self.original_translation.translations.get(language=language) def handle_modeladmin(self, modeladmin): def available_translations_admin(self, page): translations = dict((p.language, p.id) for p in page.available_translations()) links = [] for key, title in django_settings.LANGUAGES: if key == page.language: continue if key in translations: links.append(u'%s' % ( translations[key], _('Edit translation'), key.upper())) else: links.append(u'%s' % ( page.id, key, _('Create translation'), key.upper())) return u' | '.join(links) available_translations_admin.allow_tags = True available_translations_admin.short_description = _('translations') modeladmin.__class__.available_translations_admin = available_translations_admin if hasattr(modeladmin, 'add_extension_options'): modeladmin.add_extension_options('language', 'translation_of') modeladmin.list_display.extend(['language', 'available_translations_admin']) modeladmin.list_filter.extend(['language']) modeladmin.raw_id_fields.append('translation_of') # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/medialibrary/000077500000000000000000000000001212255543400205275ustar00rootroot00000000000000feincms-1.7.4/feincms/module/medialibrary/__init__.py000066400000000000000000000006501212255543400226410ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import import logging # ------------------------------------------------------------------------ logger = logging.getLogger('feincms.medialibrary') # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/medialibrary/admin.py000066400000000000000000000011031212255543400221640ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import from django.contrib import admin from .models import Category, MediaFile from .modeladmins import CategoryAdmin, MediaFileAdmin # ------------------------------------------------------------------------ admin.site.register(Category, CategoryAdmin) admin.site.register(MediaFile, MediaFileAdmin) # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/medialibrary/fields.py000066400000000000000000000064101212255543400223500ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import from os.path import splitext from django.contrib.admin.widgets import AdminFileWidget from django.contrib.admin.widgets import ForeignKeyRawIdWidget from django.db import models from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from feincms.admin.item_editor import FeinCMSInline from feincms.utils import shorten_string from .models import MediaFile from .thumbnail import admin_thumbnail __all__ = ('MediaFileForeignKey', 'ContentWithMediaFile') # ------------------------------------------------------------------------ class MediaFileForeignKeyRawIdWidget(ForeignKeyRawIdWidget): def __init__(self, original): self.__dict__ = original.__dict__ def label_for_value(self, value): key = self.rel.get_related_field().name try: obj = self.rel.to._default_manager.using(self.db).get(**{key: value}) label = [u' %s' % escape( shorten_string(unicode(obj)))] image = admin_thumbnail(obj) if image: label.append(u'
    ' % image) return u''.join(label) except (ValueError, self.rel.to.DoesNotExist): return '' class MediaFileForeignKey(models.ForeignKey): """ Drop-in replacement for Django's ``models.ForeignKey`` which automatically adds a thumbnail of media files if the media file foreign key is shown using ``raw_id_fields``. """ def formfield(self, **kwargs): if 'widget' in kwargs and isinstance(kwargs['widget'], ForeignKeyRawIdWidget): kwargs['widget'] = MediaFileForeignKeyRawIdWidget(kwargs['widget']) return super(MediaFileForeignKey, self).formfield(**kwargs) class ContentWithMediaFile(models.Model): class feincms_item_editor_inline(FeinCMSInline): raw_id_fields = ('mediafile',) mediafile = MediaFileForeignKey(MediaFile, verbose_name=_('media file'), related_name='+') class Meta: abstract = True # ------------------------------------------------------------------------ class AdminFileWithPreviewWidget(AdminFileWidget): """ Simple AdminFileWidget, but detects if the file is an image and tries to render a small thumbnail besides the input field. """ def render(self, name, value, attrs=None): r = super(AdminFileWithPreviewWidget, self).render(name, value, attrs=attrs) if value and getattr(value, 'instance', None): image = admin_thumbnail(value.instance) if image: r = mark_safe((u'' % image) + r) return r # ------------------------------------------------------------------------ try: from south.modelsinspector import add_introspection_rules add_introspection_rules(rules=[((MediaFileForeignKey,), [], {},)], patterns=["^feincms\.module\.medialibrary\.fields"]) except ImportError: pass feincms-1.7.4/feincms/module/medialibrary/forms.py000066400000000000000000000055251212255543400222360ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import import os from django import forms from django.utils.translation import ugettext_lazy as _ from feincms import settings from . import logger from .models import Category, MediaFile from .fields import AdminFileWithPreviewWidget # ------------------------------------------------------------------------ class MediaCategoryAdminForm(forms.ModelForm): class Meta: model = Category def clean_parent(self): data = self.cleaned_data['parent'] if data is not None and self.instance in data.path_list(): raise forms.ValidationError(_("This would create a loop in the hierarchy")) return data def __init__(self,* args, **kwargs): super(MediaCategoryAdminForm, self).__init__(*args, **kwargs) self.fields['parent'].queryset = self.fields['parent'].queryset.exclude(pk=self.instance.pk) # ------------------------------------------------------------------------ class MediaFileAdminForm(forms.ModelForm): class Meta: model = MediaFile widgets = { 'file': AdminFileWithPreviewWidget } def __init__(self, *args, **kwargs): super(MediaFileAdminForm, self).__init__(*args, **kwargs) if settings.FEINCMS_MEDIAFILE_OVERWRITE and self.instance.id: if not hasattr(self.instance.file.field, '_feincms_generate_filename_patched'): orig_generate_filename = self.instance.file.field.generate_filename def _gen_fname(instance, filename): if instance.id and hasattr(instance, 'original_name'): logger.info("Overwriting file %s with new data" % instance.original_name) instance.file.storage.delete(instance.original_name) return instance.original_name return orig_generate_filename(instance, filename) self.instance.file.field.generate_filename = _gen_fname self.instance.file.field._feincms_generate_filename_patched = True def clean_file(self): if settings.FEINCMS_MEDIAFILE_OVERWRITE and self.instance.id: new_base, new_ext = os.path.splitext(self.cleaned_data['file'].name) old_base, old_ext = os.path.splitext(self.instance.file.name) if new_ext.lower() != old_ext.lower(): raise forms.ValidationError(_("Cannot overwrite with different file type (attempt to overwrite a %(old_ext)s with a %(new_ext)s)") % { 'old_ext': old_ext, 'new_ext': new_ext }) self.instance.original_name = self.instance.file.name return self.cleaned_data['file'] # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/medialibrary/modeladmins.py000066400000000000000000000205661212255543400234060ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import import os from django import forms from django.conf import settings as django_settings from django.contrib import admin from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.sites.models import Site from django.core.files.images import get_image_dimensions from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django.template.context import RequestContext from django.template.defaultfilters import filesizeformat from django.utils.safestring import mark_safe from django.utils.translation import ungettext, ugettext_lazy as _ from django.views.decorators.csrf import csrf_protect from ...translations import admin_translationinline, lookup_translations from .models import Category, MediaFileTranslation from .forms import MediaCategoryAdminForm, MediaFileAdminForm from .thumbnail import admin_thumbnail # ----------------------------------------------------------------------- class CategoryAdmin(admin.ModelAdmin): form = MediaCategoryAdminForm list_display = ['path'] list_filter = ['parent'] list_per_page = 25 search_fields = ['title'] prepopulated_fields = { 'slug': ('title',), } #------------------------------------------------------------------------- def assign_category(modeladmin, request, queryset): class AddCategoryForm(forms.Form): _selected_action = forms.CharField(widget=forms.MultipleHiddenInput) category = forms.ModelChoiceField(Category.objects.all()) form = None if 'apply' in request.POST: form = AddCategoryForm(request.POST) if form.is_valid(): category = form.cleaned_data['category'] count = 0 for mediafile in queryset: category.mediafile_set.add(mediafile) count += 1 message = ungettext('Successfully added %(count)d media file to %(category)s.', 'Successfully added %(count)d media files to %(category)s.', count) % {'count':count, 'category':category} modeladmin.message_user(request, message) return HttpResponseRedirect(request.get_full_path()) if 'cancel' in request.POST: return HttpResponseRedirect(request.get_full_path()) if not form: form = AddCategoryForm(initial={ '_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME), }) return render_to_response('admin/medialibrary/add_to_category.html', { 'mediafiles': queryset, 'category_form': form, 'opts': modeladmin.model._meta, }, context_instance=RequestContext(request)) assign_category.short_description = _('Add selected media files to category') #------------------------------------------------------------------------- def save_as_zipfile(modeladmin, request, queryset): from .zip import export_zipfile site = Site.objects.get_current() try: zip_name = export_zipfile(site, queryset) messages.info(request, _("ZIP file exported as %s") % zip_name) except Exception, e: messages.error(request, _("ZIP file export failed: %s") % str(e)) return return HttpResponseRedirect(os.path.join(django_settings.MEDIA_URL, zip_name)) save_as_zipfile.short_description = _('Export selected media files as zip file') # ------------------------------------------------------------------------ class MediaFileAdmin(admin.ModelAdmin): form = MediaFileAdminForm save_on_top = True date_hierarchy = 'created' inlines = [admin_translationinline(MediaFileTranslation)] list_display = ['admin_thumbnail', '__unicode__', 'file_info', 'formatted_created'] list_display_links = ['__unicode__'] list_filter = ['type', 'categories'] list_per_page = 25 search_fields = ['copyright', 'file', 'translations__caption'] filter_horizontal = ("categories",) actions = [assign_category, save_as_zipfile] def get_urls(self): from django.conf.urls import patterns, include, url urls = super(MediaFileAdmin, self).get_urls() my_urls = patterns('', url(r'^mediafile-bulk-upload/$', self.admin_site.admin_view(MediaFileAdmin.bulk_upload), {}, name='mediafile_bulk_upload') ) return my_urls + urls def changelist_view(self, request, extra_context=None): if extra_context is None: extra_context = {} extra_context['categories'] = Category.objects.order_by('title') return super(MediaFileAdmin, self).changelist_view(request, extra_context=extra_context) def admin_thumbnail(self, obj): image = admin_thumbnail(obj) if image: return mark_safe(u""" """ % { 'url': obj.file.url, 'image': image,}) return '' admin_thumbnail.short_description = _('Preview') admin_thumbnail.allow_tags = True def formatted_file_size(self, obj): return filesizeformat(obj.file_size) formatted_file_size.short_description = _("file size") formatted_file_size.admin_order_field = 'file_size' def formatted_created(self, obj): return obj.created.strftime("%Y-%m-%d") formatted_created.short_description = _("created") formatted_created.admin_order_field = 'created' def file_type(self, obj): t = obj.filetypes_dict[obj.type] if obj.type == 'image': # get_image_dimensions is expensive / slow if the storage is not local filesystem (indicated by availability the path property) try: obj.file.path except NotImplementedError: return t try: d = get_image_dimensions(obj.file.file) if d: t += " %d×%d" % ( d[0], d[1] ) except (IOError, ValueError), e: t += " (%s)" % e.strerror return t file_type.admin_order_field = 'type' file_type.short_description = _('file type') file_type.allow_tags = True def file_info(self, obj): """ Method for showing the file name in admin. Note: This also includes a hidden field that can be used to extract the file name later on, this can be used to access the file name from JS, like for example a TinyMCE connector shim. """ from feincms.utils import shorten_string return u' %s
    %s, %s' % ( obj.id, obj.file.name, obj.id, shorten_string(os.path.basename(obj.file.name), max_length=40), self.file_type(obj), self.formatted_file_size(obj), ) file_info.admin_order_field = 'file' file_info.short_description = _('file info') file_info.allow_tags = True @staticmethod @csrf_protect @permission_required('medialibrary.add_mediafile') def bulk_upload(request): from .zip import import_zipfile if request.method == 'POST' and 'data' in request.FILES: try: count = import_zipfile(request.POST.get('category'), request.POST.get('overwrite', False), request.FILES['data']) messages.info(request, _("%d files imported") % count) except Exception, e: messages.error(request, _("ZIP import failed: %s") % str(e)) else: messages.error(request, _("No input file given")) return HttpResponseRedirect(reverse('admin:medialibrary_mediafile_changelist')) def queryset(self, request): return super(MediaFileAdmin, self).queryset(request).transform(lookup_translations()) def save_model(self, request, obj, form, change): obj.purge_translation_cache() return super(MediaFileAdmin, self).save_model(request, obj, form, change) # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/medialibrary/models.py000066400000000000000000000213211212255543400223630ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import import os import re from django.db import models from django.db.models.signals import post_delete from django.dispatch.dispatcher import receiver from django.template.defaultfilters import slugify from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from feincms import settings from feincms.models import ExtensionsMixin from feincms.translations import (TranslatedObjectMixin, Translation, TranslatedObjectManager) from . import logger # ------------------------------------------------------------------------ class CategoryManager(models.Manager): """ Simple manager which exists only to supply ``.select_related("parent")`` on querysets since we can't even __unicode__ efficiently without it. """ def get_query_set(self): return super(CategoryManager, self).get_query_set().select_related("parent") # ------------------------------------------------------------------------ class Category(models.Model): """ These categories are meant primarily for organizing media files in the library. """ title = models.CharField(_('title'), max_length=200) parent = models.ForeignKey('self', blank=True, null=True, related_name='children', limit_choices_to={'parent__isnull': True}, verbose_name=_('parent')) slug = models.SlugField(_('slug'), max_length=150) class Meta: ordering = ['parent__title', 'title'] verbose_name = _('category') verbose_name_plural = _('categories') objects = CategoryManager() def __unicode__(self): if self.parent_id: return u'%s - %s' % (self.parent.title, self.title) return self.title def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super(Category, self).save(*args, **kwargs) save.alters_data = True def path_list(self): if self.parent is None: return [ self ] p = self.parent.path_list() p.append(self) return p def path(self): return ' - '.join((f.title for f in self.path_list())) # ------------------------------------------------------------------------ class MediaFileBase(models.Model, ExtensionsMixin, TranslatedObjectMixin): """ Abstract media file class. Includes the :class:`feincms.models.ExtensionsMixin` because of the (handy) extension mechanism. """ file = models.FileField(_('file'), max_length=255, upload_to=settings.FEINCMS_MEDIALIBRARY_UPLOAD_TO) type = models.CharField(_('file type'), max_length=12, editable=False, choices=()) created = models.DateTimeField(_('created'), editable=False, default=timezone.now) copyright = models.CharField(_('copyright'), max_length=200, blank=True) file_size = models.IntegerField(_("file size"), blank=True, null=True, editable=False) categories = models.ManyToManyField(Category, verbose_name=_('categories'), blank=True, null=True) categories.category_filter = True class Meta: abstract = True ordering = ['-created'] verbose_name = _('media file') verbose_name_plural = _('media files') objects = TranslatedObjectManager() filetypes = [ ] filetypes_dict = { } @classmethod def reconfigure(cls, upload_to=None, storage=None): f = cls._meta.get_field('file') # Ugh. Copied relevant parts from django/db/models/fields/files.py # FileField.__init__ (around line 225) if storage: f.storage = storage if upload_to: f.upload_to = upload_to if callable(upload_to): f.generate_filename = upload_to @classmethod def register_filetypes(cls, *types): cls.filetypes[0:0] = types choices = [ t[0:2] for t in cls.filetypes ] cls.filetypes_dict = dict(choices) cls._meta.get_field('type').choices[:] = choices def __init__(self, *args, **kwargs): super(MediaFileBase, self).__init__(*args, **kwargs) if self.file: self._original_file_name = self.file.name def __unicode__(self): trans = None try: trans = self.translation except models.ObjectDoesNotExist: pass except AttributeError: pass if trans: trans = unicode(trans) if trans.strip(): return trans return os.path.basename(self.file.name) def get_absolute_url(self): return self.file.url def determine_file_type(self, name): """ >>> t = MediaFileBase() >>> t.determine_file_type('foobar.jpg') 'image' >>> t.determine_file_type('foobar.PDF') 'pdf' >>> t.determine_file_type('foobar.jpg.pdf') 'pdf' >>> t.determine_file_type('foobar.jgp') 'other' >>> t.determine_file_type('foobar-jpg') 'other' """ for type_key, type_name, type_test in self.filetypes: if type_test(name): return type_key return self.filetypes[-1][0] def save(self, *args, **kwargs): if not self.id and not self.created: self.created = timezone.now() self.type = self.determine_file_type(self.file.name) if self.file: try: self.file_size = self.file.size except (OSError, IOError, ValueError), e: logger.error("Unable to read file size for %s: %s" % (self, e)) super(MediaFileBase, self).save(*args, **kwargs) logger.info("Saved mediafile %d (%s, type %s, %d bytes)" % (self.id, self.file.name, self.type, self.file_size)) # User uploaded a new file. Try to get rid of the old file in # storage, to avoid having orphaned files hanging around. if getattr(self, '_original_file_name', None): if self.file.name != self._original_file_name: self.delete_mediafile(self._original_file_name) self.purge_translation_cache() save.alters_data = True def delete_mediafile(self, name=None): if name is None: name = self.file.name try: self.file.storage.delete(name) except Exception, e: logger.warn("Cannot delete media file %s: %s" % (name, e)) # ------------------------------------------------------------------------ MediaFileBase.register_filetypes( # Should we be using imghdr.what instead of extension guessing? ('image', _('Image'), lambda f: re.compile(r'\.(bmp|jpe?g|jp2|jxr|gif|png|tiff?)$', re.IGNORECASE).search(f)), ('video', _('Video'), lambda f: re.compile(r'\.(mov|m[14]v|mp4|avi|mpe?g|qt|ogv|wmv|flv)$', re.IGNORECASE).search(f)), ('audio', _('Audio'), lambda f: re.compile(r'\.(au|mp3|m4a|wma|oga|ram|wav)$', re.IGNORECASE).search(f)), ('pdf', _('PDF document'), lambda f: f.lower().endswith('.pdf')), ('swf', _('Flash'), lambda f: f.lower().endswith('.swf')), ('txt', _('Text'), lambda f: f.lower().endswith('.txt')), ('rtf', _('Rich Text'), lambda f: f.lower().endswith('.rtf')), ('zip', _('Zip archive'), lambda f: f.lower().endswith('.zip')), ('doc', _('Microsoft Word'), lambda f: re.compile(r'\.docx?$', re.IGNORECASE).search(f)), ('xls', _('Microsoft Excel'), lambda f: re.compile(r'\.xlsx?$', re.IGNORECASE).search(f)), ('ppt', _('Microsoft PowerPoint'), lambda f: re.compile(r'\.pptx?$', re.IGNORECASE).search(f)), ('other', _('Binary'), lambda f: True), # Must be last ) # ------------------------------------------------------------------------ class MediaFile(MediaFileBase): pass @receiver(post_delete, sender=MediaFile) def _mediafile_post_delete(sender, instance, **kwargs): instance.delete_mediafile() logger.info("Deleted mediafile %d (%s)" % (instance.id, instance.file.name)) # ------------------------------------------------------------------------ class MediaFileTranslation(Translation(MediaFile)): """ Translated media file caption and description. """ caption = models.CharField(_('caption'), max_length=200) description = models.TextField(_('description'), blank=True) class Meta: verbose_name = _('media file translation') verbose_name_plural = _('media file translations') unique_together = ('parent', 'language_code') def __unicode__(self): return self.caption #------------------------------------------------------------------------- #------------------------------------------------------------------------- feincms-1.7.4/feincms/module/medialibrary/thumbnail.py000066400000000000000000000010201212255543400230550ustar00rootroot00000000000000from feincms import settings from feincms.templatetags import feincms_thumbnail from feincms.utils import get_object def default_admin_thumbnail(mediafile): if mediafile.type != 'image': return None return feincms_thumbnail.thumbnail(mediafile.file, '100x100') _cached_thumbnailer = None def admin_thumbnail(mediafile): global _cached_thumbnailer if not _cached_thumbnailer: _cached_thumbnailer = get_object(settings.FEINCMS_MEDIALIBRARY_THUMBNAIL) return _cached_thumbnailer(mediafile) feincms-1.7.4/feincms/module/medialibrary/zip.py000066400000000000000000000141101212255543400217000ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ # # Created by Martin J. Laubach on 2011-12-07 # Copyright (c) 2011 Martin J. Laubach. All rights reserved. # # ------------------------------------------------------------------------ from __future__ import absolute_import import json import zipfile import os import time from django.template.defaultfilters import slugify from django.conf import settings as django_settings from django.utils import timezone from .models import Category, MediaFile, MediaFileTranslation # ------------------------------------------------------------------------ export_magic = 'feincms-export-01' # ------------------------------------------------------------------------ def import_zipfile(category_id, overwrite, data): """ Import a collection of media files from a zip file. category_id: if set, the pk of a Category that all uploaded files will have added (eg. cathegory "newly uploaded files") overwrite: attempt to overwrite existing files. This might not work with non-trivial storage handlers """ category = None if category_id: category = Category.objects.get(pk=int(category_id)) z = zipfile.ZipFile(data) # Peek into zip file to find out whether it contains meta information is_export_file = False info = {} try: info = json.loads(z.comment) if info['export_magic'] == export_magic: is_export_file = True except: pass # If meta information, do we need to create any categories? # Also build translation map for category ids. category_id_map = {} if is_export_file: for cat in sorted(info.get('categories', []), key=lambda k: k.get('level', 999)): new_cat, created = Category.objects.get_or_create(slug=cat['slug'], title=cat['title']) category_id_map[cat['id']] = new_cat if created and cat.get('parent', 0): parent_cat = category_id_map.get(cat.get('parent', 0), None) if parent_cat: new_cat.parent = parent_cat new_cat.save() count = 0 for zi in z.infolist(): if not zi.filename.endswith('/'): from django.core.files.base import ContentFile bname = os.path.basename(zi.filename) if bname and not bname.startswith(".") and "." in bname: fname, ext = os.path.splitext(bname) wanted_dir = os.path.dirname(zi.filename) target_fname = slugify(fname) + ext.lower() info = {} if is_export_file: info = json.loads(zi.comment) mf = None if overwrite: full_path = os.path.join(wanted_dir, target_fname) try: mf = MediaFile.objects.get(file=full_path) mf.file.delete(save=False) except MediaFile.DoesNotExist: mf = None if mf is None: mf = MediaFile() if overwrite: mf.file.field.upload_to = wanted_dir mf.copyright = info.get('copyright', '') mf.file.save(target_fname, ContentFile(z.read(zi.filename)), save=False) mf.save() found_metadata = False if is_export_file: try: for tr in info['translations']: found_metadata = True mt, mt_created = MediaFileTranslation.objects.get_or_create(parent=mf, language_code=tr['lang']) mt.caption = tr['caption'] mt.description = tr.get('description', None) mt.save() # Add categories mf.categories = (category_id_map[cat_id] for cat_id in info.get('categories', [])) except Exception: pass if not found_metadata: mt = MediaFileTranslation() mt.parent = mf mt.caption = fname.replace('_', ' ') mt.save() if category: mf.categories.add(category) count += 1 return count # ------------------------------------------------------------------------ def export_zipfile(site, queryset): now = timezone.now() zip_name = "export_%s_%04d%02d%02d.zip" % (slugify(site.domain), now.year, now.month, now.day) zip_data = open(os.path.join(django_settings.MEDIA_ROOT, zip_name), "w") zip_file = zipfile.ZipFile(zip_data, 'w', allowZip64=True) # Save the used categories in the zip file's global comment used_categories = set() for mf in queryset: for cat in mf.categories.all(): used_categories.update(cat.path_list()) info = { 'export_magic': export_magic, 'categories': [ { 'id': cat.id, 'title': cat.title, 'slug': cat.slug, 'parent': cat.parent_id or 0, 'level': len(cat.path_list()) } for cat in used_categories ], } zip_file.comment = json.dumps(info) for mf in queryset: ctime = time.localtime(os.stat(mf.file.path).st_ctime) info = json.dumps({ 'copyright': mf.copyright, 'categories': [ cat.id for cat in mf.categories.all() ], 'translations': [ { 'lang': t.language_code, 'caption': t.caption, 'description': t.description } for t in mf.translations.all() ], }) with open(mf.file.path, "r") as file_data: zip_info = zipfile.ZipInfo(filename=mf.file.name, date_time=(ctime.tm_year, ctime.tm_mon, ctime.tm_mday, ctime.tm_hour, ctime.tm_min, ctime.tm_sec)) zip_info.comment = info zip_file.writestr(zip_info, file_data.read()) return zip_name # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/mixins.py000066400000000000000000000164341212255543400177540ustar00rootroot00000000000000from django.http import Http404 from django.template import Template from django.utils.datastructures import SortedDict from django.views import generic from django.views.generic.base import TemplateResponseMixin from feincms import settings class ContentModelMixin(object): """ Mixin for ``feincms.models.Base`` subclasses which need need some degree of additional control over the request-response cycle. """ #: Collection of request processors request_processors = None #: Collection of response processors response_processors = None def setup_request(self, request): import warnings warnings.warn( '%s.setup_request does nothing anymore, and will be removed in' ' FeinCMS v1.8', DeprecationWarning, stacklevel=2) @classmethod def register_request_processor(cls, fn, key=None): """ Registers the passed callable as request processor. A request processor always receives two arguments, the current object and the request. """ if cls.request_processors is None: cls.request_processors = SortedDict() cls.request_processors[fn if key is None else key] = fn @classmethod def register_response_processor(cls, fn, key=None): """ Registers the passed callable as response processor. A response processor always receives three arguments, the current object, the request and the response. """ if cls.response_processors is None: cls.response_processors = SortedDict() cls.response_processors[fn if key is None else key] = fn class ContentObjectMixin(TemplateResponseMixin): """ Mixin for Django's class based views which knows how to handle ``ContentModelMixin`` detail pages. This is a mixture of Django's ``SingleObjectMixin`` and ``TemplateResponseMixin`` conceptually to support FeinCMS' ``ApplicationContent`` inheritance. It does not inherit ``SingleObjectMixin`` however, because that would set a precedence for the way how detail objects are determined (and would f.e. make the page and blog module implementation harder). """ context_object_name = None def handler(self, request, *args, **kwargs): if not hasattr(self.request, '_feincms_extra_context'): self.request._feincms_extra_context = {} r = self.run_request_processors() if r: return r r = self.process_content_types() if r: return r response = self.render_to_response(self.get_context_data()) r = self.finalize_content_types(response) if r: return r r = self.run_response_processors(response) if r: return r return response def get_template_names(self): # According to the documentation this method is supposed to return # a list. However, we can also return a Template instance... if isinstance(self.template_name, (Template, list, tuple)): return self.template_name if self.template_name: return [self.template_name] self.object._needs_templates() if self.object.template.path: return [self.object.template.path] # Hopefully someone else has a usable get_template_names() # implementation... return super(ContentObjectMixin, self).get_template_names() def get_context_data(self, **kwargs): context = self.request._feincms_extra_context context[self.context_object_name or 'feincms_object'] = self.object context.update(kwargs) return super(ContentObjectMixin, self).get_context_data(**context) @property def __name__(self): """ Dummy property to make this handler behave like a normal function. This property is used by django-debug-toolbar """ return self.__class__.__name__ def run_request_processors(self): """ Before rendering an object, run all registered request processors. A request processor may peruse and modify the page or the request. It can also return a ``HttpResponse`` for shortcutting the rendering and returning that response immediately to the client. """ if not getattr(self.object, 'request_processors', None): return for fn in reversed(self.object.request_processors.values()): r = fn(self.object, self.request) if r: return r def run_response_processors(self, response): """ After rendering an object to a response, the registered response processors are called to modify the response, eg. for setting cache or expiration headers, keeping statistics, etc. """ if not getattr(self.object, 'response_processors', None): return for fn in self.object.response_processors.values(): r = fn(self.object, self.request, response) if r: return r def process_content_types(self): """ Run the ``process`` method of all content types sporting one """ # store eventual Http404 exceptions for re-raising, # if no content type wants to handle the current self.request http404 = None # did any content type successfully end processing? successful = False for content in self.object.content.all_of_type(tuple( self.object._feincms_content_types_with_process)): try: r = content.process(self.request, view=self) if r in (True, False): successful = r elif r: return r except Http404, e: http404 = e if not successful: if http404: # re-raise stored Http404 exception raise http404 extra_context = self.request._feincms_extra_context if (not settings.FEINCMS_ALLOW_EXTRA_PATH and extra_context.get('extra_path', '/') != '/' # XXX Already inside application content. I'm not sure # whether this fix is really correct... and not extra_context.get('app_config') ): raise Http404('Not found (extra_path %r on %r)' % ( extra_context.get('extra_path', '/'), self.object, )) def finalize_content_types(self, response): """ Runs finalize() on content types having such a method, adds headers and returns the final response. """ for content in self.object.content.all_of_type(tuple( self.object._feincms_content_types_with_finalize)): r = content.finalize(self.request, response) if r: return r class ContentView(ContentObjectMixin, generic.DetailView): def dispatch(self, request, *args, **kwargs): if request.method.lower() not in self.http_method_names: return self.http_method_not_allowed(request, *args, **kwargs) self.request = request self.args = args self.kwargs = kwargs self.object = self.get_object() return self.handler(request, *args, **kwargs) feincms-1.7.4/feincms/module/page/000077500000000000000000000000001212255543400167775ustar00rootroot00000000000000feincms-1.7.4/feincms/module/page/__init__.py000066400000000000000000000000011212255543400210770ustar00rootroot00000000000000 feincms-1.7.4/feincms/module/page/admin.py000066400000000000000000000022671212255543400204500ustar00rootroot00000000000000# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import from django.contrib import admin from django.core.exceptions import ImproperlyConfigured from django.db.models import FieldDoesNotExist from feincms import ensure_completely_loaded, settings from .models import Page from .modeladmins import PageAdmin # ------------------------------------------------------------------------ if settings.FEINCMS_USE_PAGE_ADMIN: ensure_completely_loaded() try: Page._meta.get_field('template_key') except FieldDoesNotExist: raise ImproperlyConfigured( "The page module requires a 'Page.register_templates()' call " "somewhere ('Page.register_regions()' is not sufficient). " "If you're not using the default Page admin, maybe try " "FEINCMS_USE_PAGE_ADMIN=False to avoid this warning." ) admin.site.register(Page, PageAdmin) # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ feincms-1.7.4/feincms/module/page/extensions/000077500000000000000000000000001212255543400211765ustar00rootroot00000000000000feincms-1.7.4/feincms/module/page/extensions/__init__.py000066400000000000000000000000001212255543400232750ustar00rootroot00000000000000feincms-1.7.4/feincms/module/page/extensions/excerpt.py000066400000000000000000000006771212255543400232340ustar00rootroot00000000000000""" Add an excerpt field to the page. """ from django.db import models from django.utils.translation import ugettext_lazy as _ def register(cls, admin_cls): cls.add_to_class('excerpt', models.TextField(_('excerpt'), blank=True, help_text=_('Add a brief excerpt summarizing the content of this page.'))) admin_cls.add_extension_options(_('Excerpt'), { 'fields': ('excerpt',), 'classes': ('collapse',), }) feincms-1.7.4/feincms/module/page/extensions/navigation.py000066400000000000000000000074441212255543400237200ustar00rootroot00000000000000""" Extend or modify the navigation with custom entries. This extension allows the website administrator to select an extension which processes, modifies or adds subnavigation entries. The bundled ``feincms_nav`` template tag knows how to collect navigation entries, be they real Page instances or extended navigation entries. """ from django.db import models from django.utils.translation import ugettext_lazy as _ from feincms import extensions from feincms.utils import get_object from feincms._internal import monkeypatch_method class TypeRegistryMetaClass(type): """ You can access the list of subclasses as .types """ def __init__(cls, name, bases, attrs): if not hasattr(cls, 'types'): cls.types = [] else: cls.types.append(cls) class PagePretender(object): """ A PagePretender pretends to be a page, but in reality is just a shim layer that implements enough functionality to inject fake pages eg. into the navigation tree. For use as fake navigation page, you should at least define the following parameters on creation: title, url, level. If using the translation extension, also add language. """ pk = None # emulate mptt properties to get the template tags working class _mptt_meta: level_attr = 'level' def __init__(self, **kwargs): for k, v in kwargs.items(): setattr(self, k, v) def get_absolute_url(self): return self.url def get_navigation_url(self): return self.get_absolute_url() def get_level(self): return self.level def get_children(self): """ overwrite this if you want nested extensions using recursetree """ return [] def available_translations(self): return () def get_original_translation(self, page): return page def short_title(self): from feincms.utils import shorten_string return shorten_string(self.title) class NavigationExtension(object): """ Base class for all navigation extensions. The name attribute is shown to the website administrator. """ __metaclass__ = TypeRegistryMetaClass name = _('navigation extension') def children(self, page, **kwargs): """ This is the method which must be overridden in every navigation extension. It receives the page the extension is attached to, the depth up to which the navigation should be resolved, and the current request object if it is available. """ raise NotImplementedError def navigation_extension_choices(): for ext in NavigationExtension.types: yield ('%s.%s' % (ext.__module__, ext.__name__), ext.name) class Extension(extensions.Extension): ident = 'navigation' # TODO actually use this def handle_model(self): self.model.add_to_class('navigation_extension', models.CharField( _('navigation extension'), choices=navigation_extension_choices(), blank=True, null=True, max_length=200, help_text=_('Select the module providing subpages for this page if you need to customize the navigation.'))) @monkeypatch_method(self.model) def extended_navigation(self, **kwargs): if not self.navigation_extension: return self.children.in_navigation() cls = get_object(self.navigation_extension, fail_silently=True) if not cls or not callable(cls): return self.children.in_navigation() return cls().children(self, **kwargs) def handle_modeladmin(self, modeladmin): modeladmin.add_extension_options(_('Navigation extension'), { 'fields': ('navigation_extension',), 'classes': ('collapse',), }) feincms-1.7.4/feincms/module/page/extensions/relatedpages.py000066400000000000000000000013751212255543400242160ustar00rootroot00000000000000""" Add a many-to-many relationship field to relate this page to other pages. """ from django.db import models from django.utils.translation import ugettext_lazy as _ from feincms.module.page.models import Page def register(cls, admin_cls): cls.add_to_class('related_pages', models.ManyToManyField(Page, blank=True, related_name='%(app_label)s_%(class)s_related', null=True, help_text=_('Select pages that should be listed as related content.'))) try: admin_cls.filter_horizontal.append('related_pages') except AttributeError: admin_cls.filter_horizontal = ['related_pages'] admin_cls.add_extension_options(_('Related pages'), { 'fields': ('related_pages',), 'classes': ('collapse',), }) feincms-1.7.4/feincms/module/page/extensions/sites.py000066400000000000000000000012331212255543400226760ustar00rootroot00000000000000from django.utils.translation import ugettext_lazy as _ from django.conf import settings from django.db import models from django.contrib.sites.models import Site from feincms.module.page.models import PageManager def current_site(queryset): return queryset.filter(site=Site.objects.get_current()) def register(cls, admin_cls): cls.add_to_class('site', models.ForeignKey(Site, verbose_name=_('Site'), default=settings.SITE_ID, )) PageManager.add_to_active_filters(current_site, key='current_site') admin_cls.list_display.extend(['site']) admin_cls.list_filter.extend(['site']) feincms-1.7.4/feincms/module/page/extensions/symlinks.py000066400000000000000000000016701212255543400234250ustar00rootroot00000000000000""" This introduces a new page type, which has no content of its own but inherits all content from the linked page. """ from django.db import models from django.utils.translation import ugettext_lazy as _ from feincms._internal import monkeypatch_property def register(cls, admin_cls): cls.add_to_class('symlinked_page', models.ForeignKey('self', blank=True, null=True, related_name='%(app_label)s_%(class)s_symlinks', verbose_name=_('symlinked page'), help_text=_('All content is inherited from this page if given.'))) @monkeypatch_property(cls) def content(self): if not hasattr(self, '_content_proxy'): if self.symlinked_page: self._content_proxy = self.content_proxy_class(self.symlinked_page) else: self._content_proxy = self.content_proxy_class(self) return self._content_proxy admin_cls.raw_id_fields.append('symlinked_page') feincms-1.7.4/feincms/module/page/extensions/titles.py000066400000000000000000000027431212255543400230620ustar00rootroot00000000000000""" Sometimes, a single title is not enough, you'd like subtitles, and maybe differing titles in the navigation and in the -tag. This extension lets you do that. """ from django.db import models from django.utils.translation import ugettext_lazy as _ from feincms._internal import monkeypatch_property def register(cls, admin_cls): cls.add_to_class('_content_title', models.TextField(_('content title'), blank=True, help_text=_('The first line is the main title, the following lines are subtitles.'))) cls.add_to_class('_page_title', models.CharField(_('page title'), max_length=100, blank=True, help_text=_('Page title for browser window. Same as title by default.'))) @monkeypatch_property(cls) def page_title(self): """ Use this for the browser window (<title>-tag in the <head> of the HTML document) """ if self._page_title: return self._page_title return self.content_title @monkeypatch_property(cls) def content_title(self): """ This should be used f.e. for the <h1>-tag """ if not self._content_title: return self.title return self._content_title.splitlines()[0] @monkeypatch_property(cls) def content_subtitle(self): return u'\n'.join(self._content_title.splitlines()[1:]) admin_cls.add_extension_options(_('Titles'), { 'fields': ('_content_title', '_page_title'), 'classes': ('collapse',), }) �����������������������������feincms-1.7.4/feincms/module/page/forms.py����������������������������������������������������������0000664�0000000�0000000�00000017057�12122555434�0020511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import import re from django import forms from django.contrib.admin.widgets import ForeignKeyRawIdWidget from django.contrib.sites.models import Site from django.db.models.loading import get_model from django.forms.models import model_to_dict from django.forms.util import ErrorList from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from feincms import ensure_completely_loaded from feincms.utils import shorten_string from mptt.forms import MPTTAdminForm class RedirectToWidget(ForeignKeyRawIdWidget): def label_for_value(self, value): match = re.match( # XXX this regex would be available as .models.REDIRECT_TO_RE r'^(?P<app_label>\w+).(?P<module_name>\w+):(?P<pk>\d+)$', value) if match: matches = match.groupdict() model = get_model(matches['app_label'], matches['module_name']) try: instance = model._default_manager.get(pk=int(matches['pk'])) return u' <strong>%s (%s)</strong>' % (instance, instance.get_absolute_url()) except model.DoesNotExist: pass return u'' # ------------------------------------------------------------------------ class PageAdminForm(MPTTAdminForm): never_copy_fields = ('title', 'slug', 'parent', 'active', 'override_url', 'translation_of', '_content_title', '_page_title') @property def page_model(self): return self._meta.model @property def page_manager(self): return self.page_model._default_manager def __init__(self, *args, **kwargs): ensure_completely_loaded() if 'initial' in kwargs: if 'parent' in kwargs['initial']: # Prefill a few form values from the parent page try: page = self.page_manager.get( pk=kwargs['initial']['parent']) data = model_to_dict(page) for field in self.page_manager.exclude_from_copy: if field in data: del data[field] # These are always excluded from prefilling for field in self.never_copy_fields: if field in data: del data[field] data.update(kwargs['initial']) kwargs['initial'] = data except self.page_model.DoesNotExist: pass elif 'translation_of' in kwargs['initial']: # Only if translation extension is active try: page = self.page_manager.get( pk=kwargs['initial']['translation_of']) original = page.original_translation data = { 'translation_of': original.id, 'template_key': original.template_key, 'active': original.active, 'in_navigation': original.in_navigation, } if original.parent: try: data['parent'] = original.parent.get_translation(kwargs['initial']['language']).id except self.page_model.DoesNotExist: # ignore this -- the translation does not exist pass data.update(kwargs['initial']) kwargs['initial'] = data except (AttributeError, self.page_model.DoesNotExist): pass # Not required, only a nice-to-have for the `redirect_to` field modeladmin = kwargs.pop('modeladmin', None) super(PageAdminForm, self).__init__(*args, **kwargs) if modeladmin: # Note: Using `parent` is not strictly correct, but we can be # sure that `parent` always points to another page instance, # and that's good enough for us. self.fields['redirect_to'].widget = RedirectToWidget( self.page_model._meta.get_field('parent').rel, modeladmin.admin_site) if 'instance' in kwargs: choices = [] for key, template in kwargs['instance'].TEMPLATE_CHOICES: template = kwargs['instance']._feincms_templates[key] if template.preview_image: choices.append((template.key, mark_safe(u'<img src="%s" alt="%s" /> %s' % ( template.preview_image, template.key, template.title, )))) else: choices.append((template.key, template.title)) self.fields['template_key'].choices = choices def clean(self): cleaned_data = super(PageAdminForm, self).clean() # No need to think further, let the user correct errors first if self._errors: return cleaned_data current_id = None # See the comment below on why we do not use Page.objects.active(), # at least for now. active_pages = self.page_manager.filter(active=True) if self.instance: current_id = self.instance.id active_pages = active_pages.exclude(id=current_id) if hasattr(Site, 'page_set') and 'site' in cleaned_data: active_pages = active_pages.filter(site=cleaned_data['site']) if not cleaned_data['active']: # If the current item is inactive, we do not need to conduct # further validation. Note that we only check for the flag, not # for any other active filters. This is because we do not want # to inspect the active filters to determine whether two pages # really won't be active at the same time. return cleaned_data if cleaned_data['override_url']: if active_pages.filter(_cached_url=cleaned_data['override_url']).count(): self._errors['override_url'] = ErrorList([_('This URL is already taken by an active page.')]) del cleaned_data['override_url'] return cleaned_data if current_id: # We are editing an existing page parent = self.page_manager.get(pk=current_id).parent else: # The user tries to create a new page parent = cleaned_data['parent'] if parent: new_url = '%s%s/' % (parent._cached_url, cleaned_data['slug']) else: new_url = '/%s/' % cleaned_data['slug'] if active_pages.filter(_cached_url=new_url).count(): self._errors['active'] = ErrorList([_('This URL is already taken by another active page.')]) del cleaned_data['active'] # Convert PK in redirect_to field to something nicer for the future redirect_to = cleaned_data.get('redirect_to') if redirect_to and re.match(r'^\d+$', redirect_to): opts = self.page_model._meta cleaned_data['redirect_to'] = '%s.%s:%s' % ( opts.app_label, opts.module_name, redirect_to) return cleaned_data # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/module/page/modeladmins.py����������������������������������������������������0000664�0000000�0000000�00000022202�12122555434�0021643�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import from django.conf import settings as django_settings from django.core.exceptions import PermissionDenied from django.contrib.contenttypes.models import ContentType from django.contrib import admin from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.utils.functional import curry from django.utils.translation import ugettext_lazy as _ from feincms import ensure_completely_loaded from feincms.admin import item_editor, tree_editor # ------------------------------------------------------------------------ from .forms import PageAdminForm # ------------------------------------------------------------------------ class PageAdmin(item_editor.ItemEditor, tree_editor.TreeEditor): class Media: css = {} js = [] form = PageAdminForm # the fieldsets config here is used for the add_view, it has no effect # for the change_view which is completely customized anyway unknown_fields = ['template_key', 'parent', 'override_url', 'redirect_to'] fieldset_insertion_index = 2 fieldsets = [ (None, { 'fields': [ ('title', 'slug'), ('active', 'in_navigation'), ], }), (_('Other options'), { 'classes': ['collapse',], 'fields': unknown_fields, }), # <-- insertion point, extensions appear here, see insertion_index above item_editor.FEINCMS_CONTENT_FIELDSET, ] readonly_fields = [] list_display = ['short_title', 'is_visible_admin', 'in_navigation_toggle', 'template'] list_filter = ['active', 'in_navigation', 'template_key', 'parent'] search_fields = ['title', 'slug'] prepopulated_fields = { 'slug': ('title',), } raw_id_fields = ['parent'] radio_fields = {'template_key': admin.HORIZONTAL} @classmethod def add_extension_options(cls, *f): if isinstance(f[-1], dict): # called with a fieldset cls.fieldsets.insert(cls.fieldset_insertion_index, f) f[1]['classes'] = list(f[1].get('classes', [])) f[1]['classes'].append('collapse') else: # assume called with "other" fields cls.fieldsets[1][1]['fields'].extend(f) def __init__(self, model, admin_site): ensure_completely_loaded() if len(model._feincms_templates) > 4 and \ 'template_key' in self.radio_fields: del(self.radio_fields['template_key']) super(PageAdmin, self).__init__(model, admin_site) # The use of fieldsets makes only fields explicitly listed in there # actually appear in the admin form. However, extensions should not be # aware that there is a fieldsets structure and even less modify it; # we therefore enumerate all of the model's field and forcibly add them # to the last section in the admin. That way, nobody is left behind. from django.contrib.admin.util import flatten_fieldsets present_fields = flatten_fieldsets(self.fieldsets) for f in self.model._meta.fields: if not f.name.startswith('_') and not f.name in ('id', 'lft', 'rght', 'tree_id', 'level') and \ not f.auto_created and not f.name in present_fields and f.editable: self.unknown_fields.append(f.name) if not f.editable: self.readonly_fields.append(f.name) in_navigation_toggle = tree_editor.ajax_editable_boolean('in_navigation', _('in navigation')) def get_form(self, *args, **kwargs): form = super(PageAdmin, self).get_form(*args, **kwargs) return curry(form, modeladmin=self) def _actions_column(self, page): editable = getattr(page, 'feincms_editable', True) preview_url = "../../r/%s/%s/" % ( ContentType.objects.get_for_model(self.model).id, page.id) actions = super(PageAdmin, self)._actions_column(page) if editable: actions.insert(0, u'<a href="add/?parent=%s" title="%s"><img src="%sfeincms/img/icon_addlink.gif" alt="%s"></a>' % ( page.pk, _('Add child page'), django_settings.STATIC_URL, _('Add child page'))) actions.insert(0, u'<a href="%s" title="%s"><img src="%sfeincms/img/selector-search.gif" alt="%s" /></a>' % ( preview_url, _('View on site'), django_settings.STATIC_URL, _('View on site'))) return actions def add_view(self, request, **kwargs): kwargs['form_url'] = request.get_full_path() # Preserve GET parameters if 'translation_of' in request.GET and 'language' in request.GET: try: original = self.model._tree_manager.get( pk=request.GET.get('translation_of')) except (AttributeError, self.model.DoesNotExist): pass else: language_code = request.GET['language'] language = dict( django_settings.LANGUAGES).get(language_code, '') kwargs['extra_context'] = { 'adding_translation': True, 'title': _( 'Add %(language)s Translation of "%(page)s"' % { 'language': language, 'page': original, } ), 'language_name': language, 'translation_of': original, } return super(PageAdmin, self).add_view(request, **kwargs) def response_add(self, request, obj, *args, **kwargs): response = super(PageAdmin, self).response_add(request, obj, *args, **kwargs) if 'parent' in request.GET and '_addanother' in request.POST and response.status_code in (301, 302): # Preserve GET parameters if we are about to add another page response['Location'] += '?parent=%s' % request.GET['parent'] if 'translation_of' in request.GET and '_copy_content_from_original' in request.POST: # Copy all contents for content_type in obj._feincms_content_types: if content_type.objects.filter(parent=obj).exists(): # Short-circuit processing -- don't copy any contents if # newly added object already has some return response try: original = self.model._tree_manager.get(pk=request.GET.get('translation_of')) original = original.original_translation obj.copy_content_from(original) obj.save() self.message_user(request, _('The content from the original translation has been copied to the newly created page.')) except (AttributeError, self.model.DoesNotExist): pass return response def _refresh_changelist_caches(self, *args, **kwargs): self._visible_pages = list(self.model.objects.active().values_list('id', flat=True)) def change_view(self, request, object_id, **kwargs): try: return super(PageAdmin, self).change_view(request, object_id, **kwargs) except PermissionDenied: from django.contrib import messages messages.add_message(request, messages.ERROR, _("You don't have the necessary permissions to edit this object")) return HttpResponseRedirect(reverse('admin:page_page_changelist')) def is_visible_admin(self, page): """ Instead of just showing an on/off boolean, also indicate whether this page is not visible because of publishing dates or inherited status. """ if not hasattr(self, "_visible_pages"): self._visible_pages = list() # Sanity check in case this is not already defined if page.parent_id and not page.parent_id in self._visible_pages: # parent page's invisibility is inherited if page.id in self._visible_pages: self._visible_pages.remove(page.id) return tree_editor.ajax_editable_boolean_cell(page, 'active', override=False, text=_('inherited')) if page.active and not page.id in self._visible_pages: # is active but should not be shown, so visibility limited by extension: show a "not active" return tree_editor.ajax_editable_boolean_cell(page, 'active', override=False, text=_('extensions')) return tree_editor.ajax_editable_boolean_cell(page, 'active') is_visible_admin.allow_tags = True is_visible_admin.short_description = _('is active') is_visible_admin.editable_boolean_field = 'active' # active toggle needs more sophisticated result function def is_visible_recursive(self, page): retval = [] for c in page.get_descendants(include_self=True): retval.append(self.is_visible_admin(c)) return retval is_visible_admin.editable_boolean_result = is_visible_recursive # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/module/page/models.py���������������������������������������������������������0000664�0000000�0000000�00000033233�12122555434�0020640�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ import re from django.core.cache import cache as django_cache from django.conf import settings as django_settings from django.db import models from django.db.models import Q, signals from django.db.models.loading import get_model from django.http import Http404 from django.utils.translation import ugettext_lazy as _ from django.db.transaction import commit_on_success from mptt.models import MPTTModel from feincms import settings from feincms.management.checker import check_database_schema from feincms.models import create_base_model from feincms.module.mixins import ContentModelMixin from feincms.module.page import processors from feincms.utils.managers import ActiveAwareContentManagerMixin from feincms.utils import path_to_cache_key REDIRECT_TO_RE = re.compile( r'^(?P<app_label>\w+).(?P<module_name>\w+):(?P<pk>\d+)$') # ------------------------------------------------------------------------ class BasePageManager(models.Manager, ActiveAwareContentManagerMixin): """ The page manager. Only adds new methods, does not modify standard Django manager behavior in any way. """ # The fields which should be excluded when creating a copy. exclude_from_copy = ['id', 'tree_id', 'lft', 'rght', 'level', 'redirect_to'] def page_for_path(self, path, raise404=False): """ Return a page for a path. Optionally raises a 404 error if requested. Example:: Page.objects.page_for_path(request.path) """ stripped = path.strip('/') try: page = self.active().get( _cached_url=u'/%s/' % stripped if stripped else '/') if not page.are_ancestors_active(): raise self.model.DoesNotExist('Parents are inactive.') return page except self.model.DoesNotExist: if raise404: raise Http404() raise def best_match_for_path(self, path, raise404=False): """ Return the best match for a path. If the path as given is unavailable, continues to search by chopping path components off the end. Tries hard to avoid unnecessary database lookups by generating all possible matching URL prefixes and choosing the longest match. Page.best_match_for_path('/photos/album/2008/09') might return the page with url '/photos/album/'. """ paths = ['/'] path = path.strip('/') # Cache path -> page resolving. # We flush the cache entry on page saving, so the cache should always # be up to date. ck = Page.path_to_cache_key(path) page = django_cache.get(ck) if page: return page if path: tokens = path.split('/') paths += ['/%s/' % '/'.join(tokens[:i]) for i in range(1, len(tokens)+1)] try: page = self.active().filter(_cached_url__in=paths).extra( select={'_url_length': 'LENGTH(_cached_url)'}).order_by('-_url_length')[0] if not page.are_ancestors_active(): raise IndexError('Parents are inactive.') django_cache.set(ck, page) return page except IndexError: if raise404: raise Http404() raise self.model.DoesNotExist def in_navigation(self): """ Returns active pages which have the ``in_navigation`` flag set. """ return self.active().filter(in_navigation=True) def toplevel_navigation(self): """ Returns top-level navigation entries. """ return self.in_navigation().filter(parent__isnull=True) def for_request(self, request, raise404=False, best_match=False, setup=False): """ Return a page for the request Does not hit the database more than once for the same request. Examples:: Page.objects.for_request(request, raise404=True, best_match=False) Defaults to raising a ``DoesNotExist`` exception if no exact match could be determined. """ if not hasattr(request, '_feincms_page'): path = request.path_info or request.path if best_match: request._feincms_page = self.best_match_for_path(path, raise404=raise404) else: request._feincms_page = self.page_for_path(path, raise404=raise404) if setup: import warnings warnings.warn( 'Calling for_request with setup=True does nothing anymore.' ' The parameter will be removed in FeinCMS v1.8.', DeprecationWarning, stacklevel=2) return request._feincms_page # ------------------------------------------------------------------------ class PageManager(BasePageManager): pass PageManager.add_to_active_filters(Q(active=True)) # ------------------------------------------------------------------------ class BasePage(create_base_model(MPTTModel), ContentModelMixin): active = models.BooleanField(_('active'), default=True) # structure and navigation title = models.CharField(_('title'), max_length=200) slug = models.SlugField(_('slug'), max_length=150) parent = models.ForeignKey('self', verbose_name=_('Parent'), blank=True, null=True, related_name='children') parent.parent_filter = True # Custom list_filter - see admin/filterspecs.py in_navigation = models.BooleanField(_('in navigation'), default=True) override_url = models.CharField(_('override URL'), max_length=255, blank=True, help_text=_('Override the target URL. Be sure to include slashes at the beginning and at the end if it is a local URL. This affects both the navigation and subpages\' URLs.')) redirect_to = models.CharField(_('redirect to'), max_length=255, blank=True, help_text=_('Target URL for automatic redirects' ' or the primary key of a page.')) _cached_url = models.CharField(_('Cached URL'), max_length=255, blank=True, editable=False, default='', db_index=True) cache_key_components = [ lambda p: getattr(django_settings, 'SITE_ID', 0), lambda p: p._django_content_type.id, lambda p: p.id ] class Meta: ordering = ['tree_id', 'lft'] abstract = True objects = PageManager() def __unicode__(self): return self.short_title() def is_active(self): """ Check whether this page and all its ancestors are active """ if not self.pk: return False pages = self.__class__.objects.active().filter(tree_id=self.tree_id, lft__lte=self.lft, rght__gte=self.rght) return pages.count() > self.level is_active.short_description = _('is active') def are_ancestors_active(self): """ Check whether all ancestors of this page are active """ if self.is_root_node(): return True queryset = PageManager.apply_active_filters(self.get_ancestors()) return queryset.count() >= self.level def short_title(self): """ Title shortened for display. """ from feincms.utils import shorten_string return shorten_string(self.title) short_title.admin_order_field = 'title' short_title.short_description = _('title') def __init__(self, *args, **kwargs): super(BasePage, self).__init__(*args, **kwargs) # Cache a copy of the loaded _cached_url value so we can reliably # determine whether it has been changed in the save handler: self._original_cached_url = self._cached_url @commit_on_success def save(self, *args, **kwargs): """ Overridden save method which updates the ``_cached_url`` attribute of this page and all subpages. Quite expensive when called with a page high up in the tree. """ cached_page_urls = {} # determine own URL if self.override_url: self._cached_url = self.override_url elif self.is_root_node(): self._cached_url = u'/%s/' % self.slug else: self._cached_url = u'%s%s/' % (self.parent._cached_url, self.slug) cached_page_urls[self.id] = self._cached_url super(BasePage, self).save(*args, **kwargs) # Okay, we have changed the page -- remove the old stale entry from the cache self.invalidate_cache() # If our cached URL changed we need to update all descendants to # reflect the changes. Since this is a very expensive operation # on large sites we'll check whether our _cached_url actually changed # or if the updates weren't navigation related: if self._cached_url == self._original_cached_url: return pages = self.get_descendants().order_by('lft') for page in pages: if page.override_url: page._cached_url = page.override_url else: # cannot be root node by definition page._cached_url = u'%s%s/' % ( cached_page_urls[page.parent_id], page.slug) cached_page_urls[page.id] = page._cached_url super(BasePage, page).save() # do not recurse save.alters_data = True @commit_on_success def delete(self, *args, **kwargs): super(BasePage, self).delete(*args, **kwargs) self.invalidate_cache() delete.alters_data = True # Remove the page from the url-to-page cache def invalidate_cache(self): ck = self.path_to_cache_key(self._original_cached_url) django_cache.delete(ck) @models.permalink def get_absolute_url(self): """ Return the absolute URL of this page. """ # result url never begins or ends with a slash url = self._cached_url.strip('/') if url: return ('feincms_handler', (url,), {}) return ('feincms_home', (), {}) def get_navigation_url(self): """ Return either ``redirect_to`` if it is set, or the URL of this page. """ # :-( maybe this could be cleaned up a bit? if not self.redirect_to or REDIRECT_TO_RE.match(self.redirect_to): return self._cached_url return self.redirect_to def cache_key(self): """ Return a string that may be used as cache key for the current page. The cache_key is unique for each content type and content instance. """ return '-'.join(unicode(fn(self)) for fn in self.cache_key_components) def etag(self, request): """ Generate an etag for this page. An etag should be unique and unchanging for as long as the page content does not change. Since we have no means to determine whether rendering the page now (as opposed to a minute ago) will actually give the same result, this default implementation returns None, which means "No etag please, thanks for asking". """ return None def last_modified(self, request): """ Generate a last modified date for this page. Since a standard page has no way of knowing this, we always return "no date" -- this is overridden by the changedate extension. """ return None def get_redirect_to_target(self, request): """ This might be overriden/extended by extension modules. """ if not self.redirect_to: return u'' # It might be an identifier for a different object match = REDIRECT_TO_RE.match(self.redirect_to) # It's not, oh well. if not match: return self.redirect_to matches = match.groupdict() model = get_model(matches['app_label'], matches['module_name']) if not model: return self.redirect_to try: instance = model._default_manager.get(pk=int(matches['pk'])) return instance.get_absolute_url() except models.ObjectDoesNotExist: pass return self.redirect_to @classmethod def path_to_cache_key(cls, path): prefix = "%s-FOR-URL" % cls.__name__.upper() return path_to_cache_key(path.strip('/'), prefix=prefix) @classmethod def register_default_processors(cls, frontend_editing=False): """ Register our default request processors for the out-of-the-box Page experience. """ cls.register_request_processor(processors.redirect_request_processor, key='redirect') cls.register_request_processor(processors.extra_context_request_processor, key='extra_context') if frontend_editing: cls.register_request_processor(processors.frontendediting_request_processor, key='frontend_editing') cls.register_response_processor(processors.frontendediting_response_processor, key='frontend_editing') # ------------------------------------------------------------------------ class Page(BasePage): class Meta: ordering = ['tree_id', 'lft'] verbose_name = _('page') verbose_name_plural = _('pages') Page.register_default_processors(frontend_editing=settings.FEINCMS_FRONTEND_EDITING) signals.post_syncdb.connect(check_database_schema(Page, __name__), weak=False) # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/module/page/processors.py�����������������������������������������������������0000664�0000000�0000000�00000013035�12122555434�0021555�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import re import sys from django.conf import settings as django_settings from django.http import Http404, HttpResponseRedirect from django.utils.cache import add_never_cache_headers def redirect_request_processor(page, request): """ Returns a ``HttpResponseRedirect`` instance if the current page says a redirect should happen. """ target = page.get_redirect_to_target(request) if target: if request._feincms_extra_context.get('extra_path', '/') == '/': return HttpResponseRedirect(target) raise Http404() def extra_context_request_processor(page, request): """ Fills ``request._feincms_extra_context`` with a few useful variables. """ request._feincms_extra_context.update({ # XXX This variable name isn't accurate anymore. 'in_appcontent_subpage': False, 'extra_path': '/', }) url = page.get_absolute_url() if request.path != url: request._feincms_extra_context.update({ 'in_appcontent_subpage': True, 'extra_path': re.sub('^' + re.escape(url.rstrip('/')), '', request.path), }) def frontendediting_request_processor(page, request): """ Sets the frontend editing state in the cookie depending on the ``frontend_editing`` GET parameter and the user's permissions. """ if not 'frontend_editing' in request.GET: return response = HttpResponseRedirect(request.path) if request.user.has_module_perms('page'): try: enable_fe = int(request.GET['frontend_editing']) > 0 except ValueError: enable_fe = False if enable_fe: response.set_cookie('frontend_editing', enable_fe) else: response.delete_cookie('frontend_editing') # Redirect to cleanup URLs return response def frontendediting_response_processor(page, request, response): # Add never cache headers in case frontend editing is active if (hasattr(request, 'COOKIES') and request.COOKIES.get('frontend_editing', False)): if hasattr(response, 'add_post_render_callback'): response.add_post_render_callback(add_never_cache_headers) else: add_never_cache_headers(response) def etag_request_processor(page, request): """ Short-circuits the request-response cycle if the ETag matches. """ # XXX is this a performance concern? Does it create a new class # every time the processor is called or is this optimized to a static # class?? class DummyResponse(dict): """ This is a dummy class with enough behaviour of HttpResponse so we can use the condition decorator without too much pain. """ def has_header(page, what): return False def dummy_response_handler(*args, **kwargs): return DummyResponse() def etagger(request, page, *args, **kwargs): etag = page.etag(request) return etag def lastmodifier(request, page, *args, **kwargs): lm = page.last_modified() return lm # Unavailable in Django 1.0 -- the current implementation of ETag support # requires Django 1.1 unfortunately. from django.views.decorators.http import condition # Now wrap the condition decorator around our dummy handler: # the net effect is that we will be getting a DummyResponse from # the handler if processing is to continue and a non-DummyResponse # (should be a "304 not modified") if the etag matches. rsp = condition(etag_func=etagger, last_modified_func=lastmodifier)(dummy_response_handler)(request, page) # If dummy then don't do anything, if a real response, return and # thus shortcut the request processing. if not isinstance(rsp, DummyResponse): return rsp def etag_response_processor(page, request, response): """ Response processor to set an etag header on outgoing responses. The Page.etag() method must return something valid as etag content whenever you want an etag header generated. """ etag = page.etag(request) if etag is not None: response['ETag'] = '"' + etag + '"' def debug_sql_queries_response_processor(verbose=False, file=sys.stderr): """ Attaches a handler which prints the query count (and optionally all individual queries which have been executed) on the console. Does nothing if ``DEBUG = False``. Example:: from feincms.module.page import models, processors models.Page.register_response_processor( processors.debug_sql_queries_response_processor(verbose=True), ) """ if not django_settings.DEBUG: return lambda page, request, response: None def processor(page, request, response): from django.db import connection print_sql = lambda x: x try: import sqlparse print_sql = lambda x: sqlparse.format(x, reindent=True, keyword_case='upper') except: pass if verbose: print >> file, "--------------------------------------------------------------" time = 0.0 i = 0 for q in connection.queries: i += 1 if verbose: print >> file, "%d : [%s]\n%s\n" % ( i, q['time'], print_sql(q['sql'])) time += float(q['time']) print >> file, "--------------------------------------------------------------" print >> file, "Total: %d queries, %.3f ms" % (i, time) print >> file, "--------------------------------------------------------------" return processor ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/module/page/sitemap.py��������������������������������������������������������0000664�0000000�0000000�00000011654�12122555434�0021022�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from django.db.models import Max from django.contrib.sitemaps import Sitemap from feincms.module.page.models import Page # ------------------------------------------------------------------------ class PageSitemap(Sitemap): """ The PageSitemap can be used to automatically generate sitemap.xml files for submission to index engines. See http://www.sitemaps.org/ for details. """ def __init__(self, navigation_only=False, max_depth=0, changefreq=None, queryset=None, filter=None, extended_navigation=False, *args, **kwargs): """ The PageSitemap accepts the following parameters for customisation of the resulting sitemap.xml output: * navigation_only -- if set to True, only pages that are in_navigation will appear in the site map. * max_depth -- if set to a non-negative integer, will limit the sitemap generated to this page hierarchy depth. * changefreq -- should be a string or callable specifiying the page update frequency, according to the sitemap protocol. * queryset -- pass in a query set to restrict the Pages to include in the site map. * filter -- pass in a callable that transforms a queryset to filter out the pages you want to include in the site map. * extended_navigation -- if set to True, adds pages from any navigation extensions. If using PagePretender, make sure to include title, url, level, in_navigation and optionally modification_date. """ super(PageSitemap, self).__init__(*args, **kwargs) self.depth_cutoff = max_depth self.navigation_only = navigation_only self.changefreq = changefreq self.filter = filter self.extended_navigation = extended_navigation if queryset is not None: self.queryset = queryset else: self.queryset = Page.objects.active() def items(self): """ Consider all pages that are active and that are not a redirect """ base_qs = self.queryset if callable(base_qs): base_qs = base_qs() self.max_depth = base_qs.aggregate(Max('level'))['level__max'] or 0 if self.depth_cutoff > 0: self.max_depth = min(self.depth_cutoff, self.max_depth) qs = base_qs.filter(redirect_to="") if self.filter: qs = self.filter(qs) if self.navigation_only: qs = qs.filter(in_navigation=True) if self.depth_cutoff > 0: qs = qs.filter(level__lte=self.max_depth-1) pages = [ p for p in qs if p.is_active() ] if self.extended_navigation: for idx, page in enumerate(pages): if self.depth_cutoff > 0 and page.level == self.max_depth: continue if getattr(page, 'navigation_extension', None): cnt = 0 for p in page.extended_navigation(): depth_too_deep = self.depth_cutoff > 0 and p.level > self.depth_cutoff not_in_nav = self.navigation_only and not p.in_navigation if depth_too_deep or not_in_nav: continue cnt += 1 pages.insert(idx + cnt, p) if p.level > self.max_depth: self.max_depth = p.level self.per_level = 1.0 / (self.max_depth + 1.0) return pages def lastmod(self, obj): return getattr(obj, 'modification_date', None) # the priority is computed of the depth in the tree of a page # may we should make an extension to give control to the user for priority def priority(self, obj): """ The priority is staggered according to the depth of the page in the site. Top level get highest priority, then each level is decreased by per_level. """ if getattr(obj, 'override_url', '') == '/': prio = 1.0 else: prio = 1.0 - (obj.level + 1) * self.per_level # If the page is in_navigation, then it's more important, so boost # its importance if obj.in_navigation: prio += 1.2 * self.per_level return "%0.2g" % min(1.0, prio) # After a call to the sitemap, be sure to erase the cached _paginator # attribute, so next time we'll re-fetch the items list instead of using # a stale list. # This has been fixed in Django r17468 def get_urls(self, *args, **kwargs): urls = super(PageSitemap, self).get_urls(*args, **kwargs) if hasattr(self, '_paginator'): del(self._paginator) return urls # ------------------------------------------------------------------------ ������������������������������������������������������������������������������������feincms-1.7.4/feincms/module/page/templatetags/�����������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021471�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/module/page/templatetags/__init__.py������������������������������������������0000664�0000000�0000000�00000000000�12122555434�0023570�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/module/page/templatetags/feincms_page_tags.py���������������������������������0000664�0000000�0000000�00000043110�12122555434�0025500�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ import logging import sys import traceback import warnings from django import template from django.conf import settings from django.http import HttpRequest from feincms.module.page.models import Page from feincms.utils.templatetags import * from feincms.utils.templatetags import _parse_args # ------------------------------------------------------------------------ logger = logging.getLogger('feincms.templatetags.page') register = template.Library() # ------------------------------------------------------------------------ # TODO: Belongs in some utility module def format_exception(e): top = traceback.extract_tb(sys.exc_info()[2])[-1] return u"'%s' in %s line %d" % (e, top[0], top[1]) # ------------------------------------------------------------------------ @register.assignment_tag(takes_context=True) def feincms_nav(context, feincms_page, level=1, depth=1): """ New, simplified version of the ``{% feincms_navigation %}`` template tag. Generally we don't like abbreviations too much, but the similarity with the HTML5 <nav> tag was just too tempting. """ if isinstance(feincms_page, HttpRequest): try: # warning: explicit Page reference here feincms_page = Page.objects.for_request( feincms_page, best_match=True) except Page.DoesNotExist: return [] mptt_opts = feincms_page._mptt_meta # mptt starts counting at zero mptt_level_range = [level - 1, level + depth - 1] queryset = feincms_page.__class__._default_manager.in_navigation().filter( **{ '%s__gte' % mptt_opts.level_attr: mptt_level_range[0], '%s__lt' % mptt_opts.level_attr: mptt_level_range[1], } ) page_level = getattr(feincms_page, mptt_opts.level_attr) # Used for subset filtering (level>1) parent = None if level > 1: # A subset of the pages is requested. Determine it depending # upon the passed page instance if level - 2 == page_level: # The requested pages start directly below the current page parent = feincms_page elif level - 2 < page_level: # The requested pages start somewhere higher up in the tree parent = feincms_page.get_ancestors()[level - 2] elif level - 1 > page_level: # The requested pages are grandchildren of the current page # (or even deeper in the tree). If we would continue processing, # this would result in pages from different subtrees being # returned directly adjacent to each other. queryset = Page.objects.none() if parent: if getattr(parent, 'navigation_extension', None): # Special case for navigation extensions return list(parent.extended_navigation(depth=depth, request=context.get('request'))) # Apply descendant filter queryset &= parent.get_descendants() if depth > 1: # Filter out children with inactive parents # None (no parent) is always allowed parents = set([None]) if parent: # Subset filtering; allow children of parent as well parents.add(parent.id) def _parentactive_filter(iterable): for elem in iterable: if elem.parent_id in parents: yield elem parents.add(elem.id) queryset = _parentactive_filter(queryset) if hasattr(feincms_page, 'navigation_extension'): # Filter out children of nodes which have a navigation extension def _navext_filter(iterable): current_navextension_node = None for elem in iterable: # Eliminate all subitems of last processed nav extension if current_navextension_node is not None and \ current_navextension_node.is_ancestor_of(elem): continue yield elem if getattr(elem, 'navigation_extension', None): current_navextension_node = elem try: for extended in elem.extended_navigation(depth=depth, request=context.get('request')): # Only return items from the extended navigation which # are inside the requested level+depth values. The # "-1" accounts for the differences in MPTT and # navigation level counting this_level = getattr(extended, mptt_opts.level_attr, 0) if this_level < level + depth - 1: yield extended except Exception, e: logger.warn("feincms_nav caught exception in navigation extension for page %d: %s", current_navextension_node.id, format_exception(e)) else: current_navextension_node = None queryset = _navext_filter(queryset) # Return a list, not a generator so that it can be consumed # several times in a template. return list(queryset) # ------------------------------------------------------------------------ class NavigationNode(SimpleAssignmentNodeWithVarAndArgs): """ Return a list of pages to be used for the navigation level: 1 = toplevel, 2 = sublevel, 3 = sub-sublevel depth: 1 = only one level, 2 = subpages too extended: run navigation extension on returned pages, not only on top-level node If you set depth to something else than 1, you might want to look into the tree_info template tag from the mptt_tags library. Example:: {% feincms_navigation of feincms_page as sublevel level=2,depth=1 %} {% for p in sublevel %} <a href="{{ p.get_absolute_url }}">{{ p.title }}</a> {% endfor %} """ def what(self, instance, args): warnings.warn('feincms_navigation and feincms_navigation_extended have' ' been deprecated and will be removed in FeinCMS v1.8. Start using' ' the new, shiny and bug-free feincms_nav today!', DeprecationWarning, stacklevel=3) return feincms_nav( self.render_context, instance, level=int(args.get('level', 1)), depth=int(args.get('depth', 1)), ) register.tag('feincms_navigation', do_simple_assignment_node_with_var_and_args_helper(NavigationNode)) # ------------------------------------------------------------------------ class ExtendedNavigationNode(NavigationNode): def render(self, context): self.render_context = context try: instance = self.in_var.resolve(context) except template.VariableDoesNotExist: context[self.var_name] = [] return '' context[self.var_name] = self.what(instance, _parse_args(self.args, context)) return '' register.tag('feincms_navigation_extended', do_simple_assignment_node_with_var_and_args_helper(ExtendedNavigationNode)) # ------------------------------------------------------------------------ class ParentLinkNode(SimpleNodeWithVarAndArgs): """ {% feincms_parentlink of feincms_page level=1 %} """ def what(self, page, args): level = int(args.get('level', 1)) if page.level + 1 == level: return page.get_absolute_url() elif page.level + 1 < level: return '#' try: return page.get_ancestors()[level - 1].get_absolute_url() except IndexError: return '#' register.tag('feincms_parentlink', do_simple_node_with_var_and_args_helper(ParentLinkNode)) # ------------------------------------------------------------------------ class LanguageLinksNode(SimpleAssignmentNodeWithVarAndArgs): """ :: {% feincms_languagelinks for feincms_page as links [args] %} This template tag needs the translations extension. Arguments can be any combination of: * all or existing: Return all languages or only those where a translation exists * excludecurrent: Excludes the item in the current language from the list * request=request: The current request object, only needed if you are using AppContents and need to append the "extra path" The default behavior is to return an entry for all languages including the current language. Example:: {% feincms_languagelinks for feincms_page as links all,excludecurrent %} {% for key, name, link in links %} <a href="{% if link %}{{ link }}{% else %}/{{ key }}/{% endif %}">{% trans name %}</a> {% endfor %} """ def what(self, page, args): only_existing = args.get('existing', False) exclude_current = args.get('excludecurrent', False) # Preserve the trailing path when switching languages if extra_path # exists (this is mostly the case when we are working inside an # ApplicationContent-managed page subtree) trailing_path = u'' request = args.get('request', None) if request: # Trailing path without first slash trailing_path = request._feincms_extra_context.get('extra_path', '')[1:] translations = dict((t.language, t) for t in page.available_translations()) translations[page.language] = page links = [] for key, name in settings.LANGUAGES: if exclude_current and key == page.language: continue # hardcoded paths... bleh if key in translations: links.append((key, name, translations[key].get_absolute_url()+trailing_path)) elif not only_existing: links.append((key, name, None)) return links register.tag('feincms_languagelinks', do_simple_assignment_node_with_var_and_args_helper(LanguageLinksNode)) # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ def _translate_page_into(page, language, default=None): """ Return the translation for a given page """ # Optimisation shortcut: No need to dive into translations if page already what we want try: if page.language == language: return page if language is not None: translations = dict((t.language, t) for t in page.available_translations()) if language in translations: return translations[language] except AttributeError: pass if hasattr(default, '__call__'): return default(page=page) return default # ------------------------------------------------------------------------ class TranslatedPageNode(SimpleAssignmentNodeWithVarAndArgs): """ :: {% feincms_translatedpage for feincms_page as feincms_transpage language=en %} {% feincms_translatedpage for feincms_page as originalpage %} {% feincms_translatedpage for some_page as translatedpage language=feincms_page.language %} This template tag needs the translations extension. Returns the requested translation of the page if it exists. If the language argument is omitted the primary language will be returned (the first language specified in settings.LANGUAGES). Note: To distinguish between a bare language code and a variable we check whether settings LANGUAGES contains that code -- so naming a variable "en" will probably not do what is intended. """ def what(self, page, args, default=None): language = args.get('language', None) if language is None: language = settings.LANGUAGES[0][0] else: if language not in (x[0] for x in settings.LANGUAGES): try: language = template.Variable(language).resolve(self.render_context) except template.VariableDoesNotExist: language = settings.LANGUAGES[0][0] return _translate_page_into(page, language, default=default) register.tag('feincms_translatedpage', do_simple_assignment_node_with_var_and_args_helper(TranslatedPageNode)) # ------------------------------------------------------------------------ class TranslatedPageNodeOrBase(TranslatedPageNode): def what(self, page, args): return super(TranslatedPageNodeOrBase, self).what(page, args, default=getattr(page, 'get_original_translation', page)) register.tag('feincms_translatedpage_or_base', do_simple_assignment_node_with_var_and_args_helper(TranslatedPageNodeOrBase)) # ------------------------------------------------------------------------ @register.filter def feincms_translated_or_base(pages, language=None): if not hasattr(pages, '__iter__'): pages = [ pages ] for page in pages: yield _translate_page_into(page, language, default=page.get_original_translation) # ------------------------------------------------------------------------ @register.inclusion_tag("breadcrumbs.html") def feincms_breadcrumbs(page, include_self=True): """ Generate a list of the page's ancestors suitable for use as breadcrumb navigation. By default, generates an unordered list with the id "breadcrumbs" - override breadcrumbs.html to change this. :: {% feincms_breadcrumbs feincms_page %} """ if not page or not isinstance(page, Page): raise ValueError("feincms_breadcrumbs must be called with a valid Page object") ancs = page.get_ancestors() bc = [(anc.get_absolute_url(), anc.short_title()) for anc in ancs] if include_self: bc.append((None, page.short_title())) return {"trail": bc} # ------------------------------------------------------------------------ def _is_parent_of(page1, page2): return page1.tree_id == page2.tree_id and page1.lft < page2.lft and page1.rght > page2.rght @register.filter def is_parent_of(page1, page2): """ Determines whether a given page is the parent of another page Example:: {% if page|is_parent_of:feincms_page %} ... {% endif %} """ try: return _is_parent_of(page1, page2) except AttributeError: return False # ------------------------------------------------------------------------ def _is_equal_or_parent_of(page1, page2): return page1.tree_id == page2.tree_id and page1.lft <= page2.lft and page1.rght >= page2.rght @register.filter def is_equal_or_parent_of(page1, page2): """ Determines whether a given page is equal to or the parent of another page. This is especially handy when generating the navigation. The following example adds a CSS class ``current`` to the current main navigation entry:: {% for page in navigation %} <a {% if page|is_equal_or_parent_of:feincms_page %}class="current"{% endif %}> {{ page.title }}</a> {% endfor %} """ try: return _is_equal_or_parent_of(page1, page2) except AttributeError: return False # ------------------------------------------------------------------------ def _is_sibling_of(page1, page2): return page1.parent_id == page2.parent_id @register.filter def is_sibling_of(page1, page2): """ Determines whether a given page is a sibling of another page :: {% if page|is_sibling_of:feincms_page %} ... {% endif %} """ try: return _is_sibling_of(page1, page2) except AttributeError: return False # ------------------------------------------------------------------------ @register.filter def siblings_along_path_to(page_list, page2): """ Filters a list of pages so that only those remain that are either: * An ancestor of the current page * A sibling of an ancestor of the current page A typical use case is building a navigation menu with the active path to the current page expanded:: {% feincms_nav feincms_page level=1 depth=3 as navitems %} {% with navitems|siblings_along_path_to:feincms_page as navtree %} ... whatever ... {% endwith %} """ if page_list: try: # Try to avoid hitting the database: If the current page is in_navigation, # then all relevant pages are already in the incoming list, no need to # fetch ancestors or children. # NOTE: This assumes that the input list actually is complete (ie. comes from # feincms_nav). We'll cope with the fall-out of that assumption # when it happens... ancestors = [a_page for a_page in page_list if _is_equal_or_parent_of(a_page, page2)] top_level = min((a_page.level for a_page in page_list)) if not ancestors: # Happens when we sit on a page outside the navigation tree # so fake an active root page to avoid a get_ancestors() db call # which would only give us a non-navigation root page anyway. p = Page(title="dummy", tree_id=-1, parent_id=None, in_navigation=False) ancestors = (p,) siblings = [a_page for a_page in page_list if a_page.parent_id == page2.id or a_page.level == top_level or any((_is_sibling_of(a_page, a) for a in ancestors))] return siblings except (AttributeError, ValueError), e: logger.warn("siblings_along_path_to caught exception: %s", format_exception(e)) return () # ------------------------------------------------------------------------ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/shortcuts.py������������������������������������������������������������������0000664�0000000�0000000�00000001015�12122555434�0017203�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.shortcuts import render_to_response from django.template import RequestContext from feincms.module.page.models import Page def render_to_response_best_match(request, template_name, dictionary=None): """ ``render_to_response`` wrapper using best match for the current page. """ dictionary = dictionary or {} dictionary['feincms_page'] = Page.objects.best_match_for_request(request) return render_to_response(template_name, dictionary, context_instance=RequestContext(request)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/signals.py��������������������������������������������������������������������0000664�0000000�0000000�00000001371�12122555434�0016612�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ # # Created by Martin J. Laubach on 2011-08-01 # Copyright (c) 2011 Martin J. Laubach. All rights reserved. # # ------------------------------------------------------------------------ from django.dispatch import Signal # ------------------------------------------------------------------------ # This signal is sent when an item editor managed object is completely # saved, especially including all foreign or manytomany dependencies. itemeditor_post_save_related = Signal(providing_args=["instance", "created"]) # ------------------------------------------------------------------------ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/�����������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0016065�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/���������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0017511�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/fein_tree.css��������������������������������������������������0000664�0000000�0000000�00000001672�12122555434�0022171�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.drag_handle { width: 16px; height: 16px; background: url(img/arrow-move.png); display: inline-block; vertical-align: middle; } .drag_handle:hover { cursor: move; } .drag_order img { cursor: move; } table tr.dragging { opacity: .3; } table tr.dragging td { color: #333; } table tr.folded { background: red; } div#drag_line { position: relative; height: 3px; font-size: 0px; background-color: #800080; } div#drag_line div { position: absolute; height: 9px; width: 9px; background-image: url(img/drag_order_circle.png); margin: -3px 0 0 -9px; } .page_marker.children { background: url(img/disclosure-down.png) no-repeat right top; } .page_marker.closed { background: url(img/disclosure-right.png) no-repeat right top; } tr.non-editable a:link, tr.non-editable a:visited, tr.non-editable td { color: #AAA; } tr.item_inactive { color: rgb(221, 17, 68); } tr.item_inactive th a { color: rgb(221, 17, 68); } ����������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/fein_tree.js���������������������������������������������������0000775�0000000�0000000�00000034436�12122555434�0022024�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /* Suppress initial rendering of result list, but only if we can show it with JS later on */ document.write('<style type="text/css">#result_list { display: none }</style>'); feincms.jQuery(function($){ // recolor tree after expand/collapse $.extend($.fn.recolorRows = function() { $('tr:visible:even', this).removeClass('row2').addClass('row1'); $('tr:visible:odd', this).removeClass('row1').addClass('row2'); /* Mark inactive rows */ $('tr.item_inactive').removeClass('item_inactive'); $('div[id^=wrap_active_] input:checkbox:not(:checked)').parents('tr').addClass('item_inactive'); $('div[id^=wrap_active_] img').parents('tr').addClass('item_inactive'); }); function isExpandedNode(id) { return feincms.collapsed_nodes.indexOf(id) == -1; } function markNodeAsExpanded(id) { // remove itemId from array of collapsed nodes var idx = feincms.collapsed_nodes.indexOf(id); if(idx >= 0) feincms.collapsed_nodes.splice(idx, 1); } function markNodeAsCollapsed(id) { if(isExpandedNode(id)) feincms.collapsed_nodes.push(id); } // toggle children function doToggle(id, show) { var children = feincms.tree_structure[id]; for (var i=0; i<children.length; ++i) { var childId = children[i]; if(show) { $('#item-' + childId).show(); // only reveal children if current node is not collapsed if(isExpandedNode(childId)) { doToggle(childId, show); } } else { $('#item-' + childId).hide(); // always recursively hide children doToggle(childId, show); } } } function rowLevel($row) { return parseInt($row.attr('rel').replace(/[^\d]/ig, '')); } /* * FeinCMS Drag-n-drop tree reordering. * Based upon code by bright4 for Radiant CMS, rewritten for * FeinCMS by Bjorn Post. * * September 2010 * */ $.extend($.fn.feinTree = function() { $('tr', this).each(function(i, el) { // adds 'children' class to all parents var pageId = extract_item_id($('.page_marker', el).attr('id')); $(el).attr('id', 'item-' + pageId); if (feincms.tree_structure[pageId].length) { $('.page_marker', el).addClass('children'); } // set 'level' on rel attribute var pixels = $('.page_marker', el).css('width').replace(/[^\d]/ig,""); var rel = Math.round(pixels/18); $(el).attr('rel', rel); }); $('div.drag_handle').bind('mousedown', function(event) { BEFORE = 0; AFTER = 1; CHILD = 2; CHILD_PAD = 20; var originalRow = $(event.target).closest('tr'); var rowHeight = originalRow.height(); var childEdge = $(event.target).offset().left + $(event.target).width(); var moveTo = new Object(); var expandObj = new Object(); $("body").addClass('dragging').disableSelection().bind('mousemove', function(event) { // attach dragged item to mouse var cloned = originalRow.html(); if($('#ghost').length == 0) { $('<div id="ghost"></div>').appendTo('body'); } $('#ghost').html(cloned).css({ 'opacity': .8, 'position': 'absolute', 'top': event.pageY, 'left': event.pageX-30, 'width': 600 }); // check on edge of screen if(event.pageY+100 > $(window).height()+$(window).scrollTop()) { $('html,body').stop().animate({scrollTop: $(window).scrollTop()+250 }, 500); } else if(event.pageY-50 < $(window).scrollTop()) { $('html,body').stop().animate({scrollTop: $(window).scrollTop()-250 }, 500); } // check if drag_line element already exists, else append if($("#drag_line").length < 1) { $("body").append('<div id="drag_line" style="position:absolute">line<div></div></div>'); } // loop trough all rows $("tr", originalRow.parent()).each(function(index, element) { var element = $(element), top = element.offset().top; // check if mouse is over a row if (event.pageY >= top && event.pageY < top + rowHeight) { var targetRow = null, targetLoc = null, elementLevel = rowLevel(element); if (event.pageY >= top && event.pageY < top + rowHeight / 3) { targetRow = element; targetLoc = BEFORE; } else if (event.pageY >= top + rowHeight / 3 && event.pageY < top + rowHeight * 2 / 3) { var next = element.next(); // there's no point in allowing adding children when there are some already // better move the items to the correct place right away if (!next.length || rowLevel(next) <= elementLevel) { targetRow = element; targetLoc = CHILD; } } else if (event.pageY >= top + rowHeight * 2 / 3 && event.pageY < top + rowHeight) { var next = element.next(); if (!next.length || rowLevel(next) <= elementLevel) { targetRow = element; targetLoc = AFTER; } } if(targetRow) { var padding = 37 + element.attr('rel') * CHILD_PAD + (targetLoc == CHILD ? CHILD_PAD : 0 ); $("#drag_line").css({ 'width': targetRow.width() - padding, 'left': targetRow.offset().left + padding, 'top': targetRow.offset().top + (targetLoc == AFTER || targetLoc == CHILD ? rowHeight: 0) -1 }); // Store the found row and options moveTo.hovering = element; moveTo.relativeTo = targetRow; moveTo.side = targetLoc; return true; } } }); }); $('body').keydown(function(event) { if (event.which == '27') { $("#drag_line").remove(); $("#ghost").remove(); $("body").removeClass('dragging').enableSelection().unbind('mousemove').unbind('mouseup'); event.preventDefault(); } }); $("body").bind('mouseup', function(event) { if(moveTo.relativeTo) { var cutItem = extract_item_id(originalRow.find('.page_marker').attr('id')); var pastedOn = extract_item_id(moveTo.relativeTo.find('.page_marker').attr('id')); // get out early if items are the same if(cutItem != pastedOn) { var isParent = (moveTo.relativeTo.next().attr('rel') > moveTo.relativeTo.attr('rel')); var position = ''; // determine position if(moveTo.side == CHILD && !isParent) { position = 'last-child'; } else if (moveTo.side == BEFORE) { position = 'left'; } else { position = 'right'; } // save $.post('.', { '__cmd': 'move_node', 'position': position, 'cut_item': cutItem, 'pasted_on': pastedOn }, function(data) { window.location.reload(); }); } else { $("#drag_line").remove(); $("#ghost").remove(); } $("body").removeClass('dragging').enableSelection().unbind('mousemove').unbind('mouseup'); } }); }); return this; }); /* Every time the user expands or collapses a part of the tree, we remember the current state of the tree so we can restore it on a reload. Note: We might use html5's session storage? */ function storeCollapsedNodes(nodes) { $.cookie('feincms_collapsed_nodes', "[" + nodes.join(",") + "]", { expires: 7 }); } function retrieveCollapsedNodes() { var n = $.cookie('feincms_collapsed_nodes'); if(n != null) { try { n = $.parseJSON(n); } catch(e) { n = null; } } return n; } function expandOrCollapseNode(item) { var show = true; if(!item.hasClass('children')) return; var itemId = extract_item_id(item.attr('id')); if(!isExpandedNode(itemId)) { item.removeClass('closed'); markNodeAsExpanded(itemId); } else { item.addClass('closed'); show = false; markNodeAsCollapsed(itemId); } storeCollapsedNodes(feincms.collapsed_nodes); doToggle(itemId, show); $('#result_list tbody').recolorRows(); } $.extend($.fn.feinTreeToggleItem = function() { $(this).click(function(event){ expandOrCollapseNode($(this)); if(event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; } return false; }); return this; }); // bind the collapse all children event $.extend($.fn.bindCollapseTreeEvent = function() { $(this).click(function() { rlist = $("#result_list"); rlist.hide(); $('tbody tr', rlist).each(function(i, el) { var marker = $('.page_marker', el); if(marker.hasClass('children')) { var itemId = extract_item_id(marker.attr('id')); doToggle(itemId, false); marker.addClass('closed'); markNodeAsCollapsed(itemId); } }); storeCollapsedNodes(feincms.collapsed_nodes); rlist.show(); $('tbody', rlist).recolorRows(); }); return this; }); // bind the open all children event $.extend($.fn.bindOpenTreeEvent = function() { $(this).click(function() { rlist = $("#result_list"); rlist.hide(); $('tbody tr', rlist).each(function(i, el) { var marker = $('span.page_marker', el); if(marker.hasClass('children')) { var itemId = extract_item_id($('span.page_marker', el).attr('id')); doToggle(itemId, true); marker.removeClass('closed'); markNodeAsExpanded(itemId); } }); storeCollapsedNodes([]); rlist.show(); $('tbody', rlist).recolorRows(); }); return this; }); var changelist_tab = function(elem, event, direction) { event.preventDefault(); elem = $(elem); var ne = (direction > 0) ? elem.nextAll(':visible:first') : elem.prevAll(':visible:first'); if(ne) { elem.attr('tabindex', -1); ne.attr('tabindex', '0'); ne.focus(); } }; function keyboardNavigationHandler(event) { // console.log('keydown', this, event.keyCode); switch(event.keyCode) { case 40: // down changelist_tab(this, event, 1); break; case 38: // up changelist_tab(this, event, -1); break; case 37: // left case 39: // right expandOrCollapseNode($(this).find('.page_marker')); break; case 13: // return where_to = extract_item_id($('span', this).attr('id')); document.location = document.location.pathname + where_to + '/' break; default: break; }; } // fire! rlist = $("#result_list"); if($('tbody tr', rlist).length > 1) { rlist.hide(); $('tbody', rlist).feinTree(); $('span.page_marker', rlist).feinTreeToggleItem(); $('#collapse_entire_tree').bindCollapseTreeEvent(); $('#open_entire_tree').bindOpenTreeEvent(); // Disable things user cannot do anyway (object level permissions) non_editable_fields = $('.tree-item-not-editable', rlist).parents('tr'); non_editable_fields.addClass('non-editable'); $('input:checkbox', non_editable_fields).attr('disabled', 'disabled'); $('a:first', non_editable_fields).click(function(e){e.preventDefault()}); $('.drag_handle', non_editable_fields).removeClass('drag_handle'); /* Enable focussing, put focus on first result, add handler for keyboard navigation */ $('tr', rlist).attr('tabindex', -1); $('tbody tr:first', rlist).attr('tabindex', 0).focus(); $('tr', rlist).keydown(keyboardNavigationHandler); feincms.collapsed_nodes = []; var storedNodes = retrieveCollapsedNodes(); if(storedNodes == null) { $('#collapse_entire_tree').click(); } else { for(var i=0; i<storedNodes.length; i++) { $('#page_marker-' + storedNodes[i]).click(); } } } rlist.show(); $('tbody', rlist).recolorRows(); }); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/frontend_editing.css�������������������������������������������0000664�0000000�0000000�00000002403�12122555434�0023544�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.fe_box { position: relative; opacity: 0.6; width: 100%!important; } .fe_box .content { overflow: hidden; } #fe_controls, #fe_tools { z-index: 10000; background-color: white; /* CSS3 standard: */ opacity: 0.8; /* IE proprietary: */ filter: alpha(opacity=80); } #fe_controls { position: fixed; top: 0; right: 0; margin: 0; font-size: smaller; padding: 3px 3px 3px 4px; border-left: solid #7f7f7f 2px; border-bottom: solid #7f7f7f 2px; border-bottom-left-radius: 3px; -moz-border-radius-bottomleft: 3px; -webkit-border-bottom-left-radius: 3px; } #fe_controls > a { display: inline-block; border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px; border: 1px solid #7f7f7f; white-space: nowrap; text-decoration: none; padding: 1px 3px 2px; background-color: #e8e8e8; color: #000; } #fe_controls > a:hover { background-color: #b4d5ff; } #fe_tools { position: absolute; right: 0px; top: 0px; display: none; border: 1px solid #000; font-size: 70%; } #fe_tools a { background: #000; color: #fff; text-decoration: none; margin: 0 10px 0 0; padding: 4px 5px; display: block; float: left; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/frontend_editing.js��������������������������������������������0000664�0000000�0000000�00000002541�12122555434�0023373�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(function($){ $(function(){ feincms.fe_init_animations(); $("#fe_tools > a").live("click", function() { var fe_box = $(this).parents('div.fe_box'); if (this.id == 'fe_tools_edit') { res = fe_box.attr('id').match(/([^\-]+)-([^\-]+)-([^\-]+)-(\d+)-(\d+)/); var base = feincms.admin_index + res[1] +"/"+ res[2]; window.open(base+"/"+res[4]+'|'+res[3]+'|'+res[5]+'/', 'fe_editor', 'height=500,width=800,resizable=yes,scrollbars=yes'); } return false; }); }); feincms.fe_init_animations = function() { var fe_tools = $('#fe_tools'); $('.fe_box').hover( function(){ $(this).css('background', '#e8e8ff').animate({'opacity': 1}, 100).append(fe_tools); fe_tools.show(); }, function(){ $(this).animate({'opacity': 0.6}, 100).css('background', 'none'); fe_tools.hide(); } ); }; feincms.fe_update_content = function(identifier, content) { var region = $('#' + identifier); region.animate({'opacity': 0}).html(content); region.animate({'opacity': 1.5}).animate({'opacity': 0.6}); feincms.fe_init_animations(); }; })(feincms.jQuery); ���������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/ie_compat.js���������������������������������������������������0000664�0000000�0000000�00000002722�12122555434�0022012�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Re-implement some methods IE sadly does not */ if(typeof(Array.prototype.indexOf) == 'undefined') { // indexOf() function prototype for IE6/7/8 compatibility, taken from // JavaScript Standard Library - http://www.devpro.it/JSL/ Array.prototype.indexOf=function(elm,i){ var j=this.length; if(!i)i=0; if(i>=0){while(i<j){if(this[i++]===elm){ i=i-1+j;j=i-j; }}} else j=this.indexOf(elm,j+i); return j!==this.length?j:-1; }; } if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "function") throw new TypeError(); var res = []; var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in this) { var val = this[i]; // in case fun mutates this if (fun.call(thisp, val, i, this)) res.push(val); } } return res; }; } if (!Array.prototype.map) { Array.prototype.map = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "function") throw new TypeError(); var res = new Array(len); var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in this) res[i] = fun.call(thisp, this[i], i, this); } return res; }; }����������������������������������������������feincms-1.7.4/feincms/static/feincms/img/�����������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0020265�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/arrow-move.png���������������������������������������������0000664�0000000�0000000�00000001344�12122555434�0023073�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���tEXtSoftware�Adobe ImageReadyqe<��IDATxlSkAiMTkz*mY/ƠAs \t($-bmMIbLwg?|oͶfy7ҡm08Ɂ$I*0t�(1l!<R8Qe$u TM5cRcof'a ,e;tܭpe*mh&kAw&7Y/sӓxM H骢d3N^N"u A9l[_,<< npA5q Gȴ`jLjC&L>x8Gj$o4,FU0~ چHX6uفS1VV럋SIEVmƵ ٻzΥXG /GO*~P@I-ݏ-U>(6c>_adHl!_4&$:͂iPvt1p]w8- WCy3 u`}A `'tܭo&a?b8eߗ&2ZL>"0Z4ENd8tV_λ+&l) 4a=`h&ZB��s @Z����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/contenttypes.png�������������������������������������������0000664�0000000�0000000�00000056736�12122555434�0023553�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�����x���+���tEXtSoftware�Adobe ImageReadyqe<��]IDATx}TEOڜ� JZ#*g8r�;s�<әߙLO "9/aav zS;;y쾂UW}+t0tI'tI$:餓N:SK9NrM:~{wljhWN'tI'hA&|΃hWN:ToUD:ZQS >tj7!_m:fsʍzPƒP.Z.l΃v 3B; CeA - Fhs-v)5=C> La!PP=;nJsdlb,@vc7O{MOce7= bjO&AB`s;~$0['4$i>VѦ<4Hdf/á=B{n0 t hv:pPh<-ng2 dm4e mB[DmI8.IYyZwhB@az9.' Iy2_VC[MhW+̗_&�zbwiODG=c '(J #],/> D` gP@G>CT߇ ^c~l?oC(3H%3cEƋоWxv$hd@38 h_@#4·4w!&vgz/$R /3X#8(IXCTkP"f7Ё2`L9M ;~[q؏#�xpPЌ1jI' ?p&>mA縝<oC{7j-8Ŭ냠Im*0\4H#ygKFSU<uΪD5_^AN AB{B i6'-t-HH9C FooCȎN"@Ћ&WJ{< &:%ż!p@ck)Ǩ0 |wٻ  /{\2}Qk RL"S2P 23tOGcYgXQJ� D3IN1.ߞ)Q uf-r` CYof^OPOH sh̛4\:B{ k0,�C8ȻR)/+3/JPԛT$Ifvd)f3ۧ}2V\RNӓuf.fsB@w�:[x7 F3>RWDBz#R)(dqkazE 躃tP`B罠/RQ?�*y8DBPvp!" 8ļ\L0FrR DJDYe-4w]v֦ͻʚ"/F2y2»�s2|6J0>Pmލ~}8QM0�0Ma"jmT΀t w| ro|<%o�v\YK·pn0CBx*]⧬!x*}Q 6W�"#/;e]:h{ $k4 >=Xiׁ})o$�dIxa"XZh,UPד"dC/()'KʻB&z(xod  u2<0ogtǩSw\k)d ߟ`] <Ĥ�h9SXcyGK')ђ`@F*J(ꐝ۵ j`e5C !ZZy½/?h o6ݒhR)CY[л1E +S|Ϟ(=1@Uo>M|GyLh d9BFqWSᠤ<00)E۟ŖEp0 e>q~J5 ,:т|3_^a E@`Tb1khݴ@G&Y;Hj)8 1 C�|彸A~eSB@֝S_c\5\{3~QA,${:lsj61_pK̝PJ1 1CZV1uΪF#(N(,ƽPjDttfӉˢ(p[Rcqɚ,b8xyqQx ]m Giro+;dhӚ-y8Ȼ?H'J10T~QBP˾OP|A,c[dtl׊ 8YÊS4#Y;+8�·]Q5V сX�ǢlK@{*b8mlWB{<.?8x7^"&]L=&bhsDָH G c e oqO4kےMAg"mB&3E( >5>iDm ȍlH?�C「<v.rm?n4_1o9c"wcFXnö<>,D7DLK!nDᄉ;CȪK`9?sa涴ORYP|,�(">ǐP?HI=�)i�3@FpO6%{+fpL�ew@ʊ*v;3`ӻ͉-HT!Qgwf yzUS%A]Xp6R1/o�TD@c4 \=$V9@0 `}X4/q\07Lލ"oojqDOM)I3r <)?!| *;E7{i5GH$Ȣ`#=5u!v󦤊9\D~D\m=̧  4FFpk E p4[NH3SD#6BOH`Ѯ7},,<LڃGQA|Q =gSXL�4 +ڳa2 T'fD{P`\&x4MKXlI-M>x>X8A:>h34Z%.B89{0K#w#Zƍe0Z'0qA�\<ɠEYX]CJ҄QNa۾604 2H� 0D+MXhh-^ez2a .Q=Ty -ihD(P 2`4E Ly  a>c[L9&eeEݒ&ʖ!G۱G"GBJTo\D2ysd~ F� m 18{F?b @^P+p ~B:p@/ .KpԂLKQzZ ;WרK2&Q΄SFn`g9 [SD/hcAL8[{Z`Ѝ[S#%~ a9>$8h1 2FD�C(N쿱71j1~}3! y`t �VoV-)iJ .�tp2Fu2ʟߩ_b˚5/-6aw8(k& {,hb>,ZOhG8IbĄ(@Sx`7}" U@BL[|Sc[;^́Hy[c4I�CX(PL{˔'+ȣ.! [sz8r^}ӏO >5-uKl@`5,%3Z+|G2pu[1�@&#( ScqD];hYeƟ|ӓDָ2iBN>$kNݵ$YuYjdO 0P?НFdEA 0GTq|V/3h2P�*LKw~ΥnA!.y2mUL;A�\7k\yNtZZV�0w3FS& Qݍ�Bf-:@r8ڥ 2:6W"jC{7Cx;zp&5$(4Gݨnjjl 0Y9i,1ҋ@Odgy+ IeCEAR8j&_)N7۝<^һa,jCQAD&m!.KA&'�ճIx�C<Ԅ-iG0Mhb3V Ő .s.\vVE 8�HfpD;@  2<ľ|֐$�HF ')h'ia#YYqȝdy pd`ms#MbSSh7z7|d~cH0އ6ڃoZµ0^�GY(P5 <3Ԛ1s`ŵh #˖F1:6%4P9�O6f`ZC5:cxD #%|iLo#$=D㥐GQ>wA3gFrxǏ`!FQ6ZhD:g@K.GLR&9ׅ: UzYra5'oXb%~3%cIE2[;pc~0 b$9ȈF "[>T< w݄T y 0>@΄~PdhW{eW<!ظh0m;9ǻ�G̽9շGcM+]tJj…v^Sa 3E!Q<b+W#XM8 @t q~vdžR:YZ"#zо6lIf>7o0b #NTh@+󮻂SsNKt^Zu;*/斤4ONQD!|gu?:@ `шw`j6y'HuU. Znd $,2`8fh@é.hS?ɽYG0{Ya͈~D^gF/JY=0/r2K%]=-тnbx~òXXooFt;b~B</0n _%-hs(+P}xNS!Q_)h QD!P(|D"O:GD2ZmCi 4?|Px$?D!^A'̒X%1צS]po^g3 _?ۿ5;nI=9̛\ɼQ<bЕo Юfp ΀qDsOxN>%(XT1)F>lGn! +F:]1 )P[ECȈPjy\>og\we2 ]hM& ڟwQ6L={13 5&0 X4'2=@'ڳ0,iLK`#Ru~VG[BLDċ* B/z]ES`z=p8L5W6>-<]Ct\Od t+#2`Z#b@,7YmgF 8&,f&~nK wu3w*l2j(F*Ǒ渾/占c =C.f8X't<b- 2CCX!ɺ�NQ2Zs,NVf-F|QpE SK轠N:锤e$/mPۤdZP'p褓N:餓N:$:餓N:餓8tI'tI'p褓N:餓N:C'tI'tN:餓N:tI'tI'p褓N:餓N:I'tI'tN:餓N:tI'tI:餓N:餓N:I'tI'tN:餓N:C'tI'tI:餓N:餓8tI'tI'tN:餓N:C'tI'tN:餓N:餓8tI'tI'p褓N:餓N:I'tI'tj2 6 G:餓N:锨CtIP|S�)ɂ-$CsCs@V|tҕduIQS:g^8%7]XRW:o+w <hdH&:Ua&%Qd>�pKAB#SCߝl�AUUSV)x(FRђB *m%A=Gі{Q>k2Fv�ǭ65G?QCA!5oߠ ucf]qJ1Cu.'J#ck: $l٩VH:*;S џ7D!0oO 2K)M[doH{2s⻷2CI."�io)]�'1`zx>�G3jϮ25ܰͩu(wO[W\Dç:lUKT|DĭLin*}6RG#82{!Pb8K,}4j\t>9$ tǤ-To5W{@0L?� ^.+8/6'Noro͵:KZ's' dZh�y;)ݤ5!Xx h,T 6R83Z$m-6:#tf3V X ˤgkwF{/ꑾw0C.\ (p*l ,uLycǞMx8 [�$ x ! fpx邷M~3}&�=8:5$c0y' Jr|#9Ж@;iϦXYݛ)x^@w]B FdlEg.q�붉4ny>_yP墀{uHĥQ"@ ^P !xS0^PkAf' (Kgӄvʴ\ 2PN@[ҀtLRȐ+lV:)vzvnm | ppP  >3?uYh?�U:>] $dvR <Hg |YLiuӄQ.u@:zNBTa AP@RhoA[mp�#О6 g*ZAa�$m0+ݝS:0)fXZS|ߩE~kMwg: "Kݕ`n&aphޗ{MQVu6[N#q!W bI6**Hy&ѻ-)̢>x\ر.}nnk?-i@GRnkဉ%;eU};_|L\Cޣ*HA4RhTxwс=եmAn6bZj9˲-;\񃑗Z|08WoSp o̗c�F,ɑZ 0.BM"WUFC1�Tӯv˜w߅ݷ #xLp[rW3"lWu)Ə0 C˧>!IdloB ^6�3s\3U47s]5&ӽFv91tӌ~K\ MDĜ,l�<DmGO ݼ5!Λ{HqѽGڳvmy*{Zyu K Bs)'.Ⱂ x4vx=g%AI<SJ~b6B_x.K٘!:K5]P#.'Ga-uiG]wq#A^iJqֶ"/3B+sɃp>n1"0d>3Vd%\Q˾l1L[Wz]7VdjרVYb~x٩yϭ_�NwZ xw @q~`3rh }{j:p2О#}|<a oxgxdn⎾!06DHܭߞ" FfNY[5t믥w$&А)\@ȓҴO %oH`g45%3|Ϊ'Yǭ�|6=<[\`ɜVu ==`=y63�:^t,2/ [xIh�VGUkvǍe;@ޒ6d +?~7YBmƓb4 ^liT(MfIn&/ ސx %<gˋu_�lkG]e#ovc ZP.0$ob :(20hИ |1;A縝<oCF&BA 9=La!\ @L$ W׀ā*!әU eiN9N3-Uw(˫IGD5]ӏʲ䦛\}; !ebY,,2 %IQ{b8PWv5?^1֕!9jbdVR;:xY=йlxmKwI� 'vMۏ؉<^6w7[PQ`J ܣ <ZoV~qћg>Sזu\/O*>]uqɵhc0sҵM&=P<Omw ʛ8XZy֎ gC[[r>[V|Z-um�17Zy꽵?7isCDXh � _v|J H` Ͽ3_ hb8 ױ5pލTޱKlcpP. PC nkà/ tSVҾ<)%kL-m9S.wsjV**uHRzSƔ`'wIjXĮ2]eϿl ~r+@|&ՈMUfeȋ +x΢g֑a6wH*Se{jdk^1 { YOT$SHʵΥ|n:iRIHcb؅zvg2fV;qVIs7[1s{~m[N=jo|CWGU0`�QU@v;v? 0V, M"a<fDGvdtxLŞ9q֊ѡrߚуSmm¦=m7k=LⓠhC l<A`#5̡YCIrAo\0\a@j>h,nsL`ƃÌP㣥*kdy(.s'7RQ~HbaeuVc0#0 nA8`w 'z0*qpT@sdJЛtW[*>U[g:D+S?%XL ;'?e2�l;Jfru* 2ΒrȒ�7 `cu 8ab(kn|c'w "YgϪCSw֗ryq۬(@Er1￿Y<rwsZ. +Qsb44Ҭ�F,IM3̗pa'ocyXYVz'ɤ,i&qI3{qɞ /,q_㲧.˯"Æ$pe#p `c-j?w\µ~kNpPBwkng,7e-Z+ uzB� t~k#1_L)X;( lERo#jI!<&xǾpkx|a_V8ﻡ9E^_[-F)q=;U䎵& %TW�Gj]&x`2~|ƮYY׺z81k<yA3wބD!@xkfu=Y`[='=sheʼSs� k Vng{Ŷ}r':iwLz-blu*q~9'>\"YL}-?bk~Ų˾׏tj,2zx)j+f4͒M QQ3¼5,<=$B>;? Hh �. aޅespgh·cpp0ŠÎ.Y= 6͖oϾ4�+>ėr]A8&]pZF�-N!+>(EHrX+.Ri_oJIU<b00_dN͸<Sa@j 4l\fx׋*Q1gbOl=nJ|Q?|ͼI[٭p䦙70*wys%سf; tfjb=;B�!;Tfuߎ΁#uMрGxo=-+{ocشm v_σvn{%Hr[Ҙ/ǺwɴCf@躏_nuMaJO1ktm5koV\4,r +z^7b2lTw-m&/3,sԒ\z_Jf_@6woVЯoM '˾aeq� ,[n7(y [67FF|3q=xG{(~ yapX$t4|8ay@db.3pœn;JcSUb``\e)? 4z?=8,(vNI9}h71_$kِ '9%dNr={Lރ%5w OѰh`+4Z2r s:/�uv71"T/^F)lxu;' vy4f` ^:mʟ?| 1@aHe:vƥJ=6ܬCy14/||ƁűFP~:fF8iLk=5y~䄒Z.@kвs'~{`CGYAF{W٥c~GjP�vaZFZHEQwOEn4 io!W䔬9靎>@1DsjFs1)ϭ; OM9?E1|G�w˛ ec1O.drx1({aC7H>Aԟp<@>SA|0 ?SD_63gnYm�fv?Xjk䥊Sukz75 ܰ(MK,-[99}o;jGBM7Y:`ў1M27^mlr:M].9bޥKn}I~Zq X=qFSS.<gO@Ǭ7Y~!)x-vAy4rm?߯|dP/:R-y lGw oG>KvUN pHe`4SwO[qg>t7UڂR5 `|[3L5 ~5R Cծ?:|6K>FVx]0+nrwoog 5 t9Yݎ;+5 a [wx(Pm/)8PdHpg!)XISz6֣5ʹpݹ4P'0X(?yk|| ƜBpy74&\aє/5Ѱi?A?:˭ҥffK$ch(N%TizNK~#cׯ$4`4-c7)&m W~R.;iE2^n?/p�lpp)^tN <y~?c %0_sp7mk�.,bp]i[I"i7H5|&O nB~iSYy[+ ;nv+;Prm&K:w:O۾opW\S$NI3Kn2 cAvCawQe<8ګ<=eH?̓(׆NV/dGΚu%qa^h=%+lI=\{w]4uX:O|CG>mZ8 mPedh.wt'4 cpH=w3=ֹZY[{kɃo9`S3w3<I�5{8eFU-jфH?x?겛:t9l`2EF3*0)Wkb1/q80I�&l|ε)Ȓ rj'u))^Vn^5wA\˖~Y6x[;p"dV ,Ijt1y13g@" (C:OL{o/=haUvi`0OZf.֌7j2kZuF^.Y핝sdd:OcWr53۱⍛?şӳ*ɋ&[+H`ߣf_%ul˗vÛ�`!^�_zԠ(9P5w-}:~a]]\HA2z=>u1 A,hE̛:0ba1{<.?s~ ?~o)K'kk,V98^w۬ VڲnZ{S6rٟJ̺ c0ѰLW�h@w3.KKf{`< W[v]auxBX<`MΠMt"gcuŚ':qVKUՆ p}~Fw/ĦT45|HA.>g+Hx*F^ԫN\u%;+:\:XU[e>~ }.`,}r "7o7ڶϛOvmxH%a³V<4kƲ./ORLk ť.d0Ndw;t_z4.^5:S_bhKrhw+E~J 2V…3GCO�WE&Xq +͡8"xeF Vw p+Y<5!{큭Kw<?Ԭ9;no^w: (bL�( 8YTvy,1ݤ4p7/[1o/tgߘG{5ڧ~d=ܕp0{ZV)䑍hW% ddQCS.{/g=�TչjO}VR4)S.~v͇f8) V٤/o_9""Ss -U^:7n5 /y+cD.Qُm�&3gS5;Boԥ~_<=WDUh7�.I}pʖiSGFy crSv-ģ0d1q*'̷⩬qlq3tF0Tڻ~[whǰiEȤ)S "`^hqSХ`f\Eܵ{cRO)2z$oC=h0,16 5-⹦$7!#Yo xc< &RR`ݟy&oܢ{V;-*_{/)5Pix?V#? ZgUYwBS+y0^:Aׯ=}W:ǷdY֕sv|Z`ktd,N?`4Yq*j YQ's1_"!wv;k8K0.Y _L[㫏+X9zhwp VLڌ#5$L L\O8W ʾW02$sGA O[p\p{7Fo׹V?pkݶ^SCR&Nc9_? NZU@mX( vwUQ7Xv9~r!a ,K ^`4b"S6cFlf~B^&R~k+;Z]Pt˾ MZ˭+Z_HOc6gg#o6MҔУȻ<bbc_[́ PPqFAaRjzښ; }95~JzۑݯX2Nw`fmpRHpY+5\,~`~vHNůnh Fm<[mdQP#ÙepCHr̗#_pnBzB>hXK,mx` Ǣ=}Wen]u�]R6zlƴL<x[T.CqspQwxt[-Yα)y%iy}.7.�p NU[Ռ+0aS6CYFIAHV=f{O�|0=g~VLtHJk# 'xt,&T^1_�udA׶6~]�q*x|1GWK �!do�lo,؇MWf:3,A#_dwAh$yHE(|?-;,ֻQtIJI>'Qqh3k85;{ Y̆evsk=OQo ޙ'"Cru>⽖'B`Sy/'}o,~r `𻗐UE_q繠�bn銡.\^*._MEUKGʼ1K_U$+j?)%mw0Fs Qcä ݵaoݐֹWw Ja~5EՏ70ťVMz?Z\y51*3?y`pQX[&;* p` \/?zk>^W7>"Ea 0Fȉx`N8=sKVxMV,qC./KR{r>-tT"]^"x =ANҚJOs, l;=jCQ4u8ܪJ=2p*K7q½yR؆mX,�6[_)_ YnD \hn@<߯OO?PW:;ud{Y\4d8βΥ-(Jd|:x'/Oa TGc,8СmD<ſw<p+-t؜ٲpo Rf 6d*RCnqD>1Ïk-h~D߇L65vXr|fUk\7kPFM;#b\pYTI>?S$a%d418x4?~;}cʗᑢFQsLժ,_?c:|\sVbBx|AP%�hwa16v=5P>a]h^�`wmVkX@VoHEʒ,ϡ*pw2S0 /0`3V ZVLFzXtc:Ro**QHQwH'VL)M|FUle9K B|50l6bz}}p^xX'/^03?޹PE}i붗^֘^c ^$W04#l,vUrEߣ6]|BGc,V{77VF>)M'�~́֔1Nj߳{՜a!5 ,E|Jʩ�u8 ];F2pVoMGR{FǼiTJ&Ξ=l: xH%Z~`Uuk _~T,=i�1{15ThK7-b|FA\9F9jy \ޥ3"ǂs^_o2s)#e]R&(t}rރskh0_oo`]v5F0 s˞�ڳDQE C lx;PXlƭ}&#K7V:�V*myp6-T+6K&zhq&)~`uJ!_;Mr톃ֻݲoZm �s?W[CHy!<#~k lƃ״a5500zcMtY4Liz@UӶ^[Qͽ`%X?u.z)CU wgoP i]>w=JkXWĪ:NV80Ќ6r@+k[͎Vbp^)ny< ^:qt.p{_ t(!( GA]tXVryB=$,;XVÇ^[U׵\,AVHm,!)/(To}锼g$-䇖퀗l0Y w͐ƕkEf&Y.wePza;V¥d{e}ZUk_US㖽9!U9|xy=چ/�2)`vUȺkkg2j8z6 Əg=ǣ>,cxX"g<JS, 8Ro ϤU �=ՓSTQ[n%6hƍ̗',,]p}cyl,nң,%K y :elR@ecO>(җ@.]L}97L"꯶3%@p0iA!UDOr�Z=q^::$L5>]2b>׆-˻[z8=h[<gg߶qU_{,spVsA^dNY9_պg|Ʈ$YHP+?!/+!+Q{>E;NRT2VeA76}cM ~g1Son۵fLW7G68VO~[_V+H�@1{>c7p.u |8VW#f+ZXy)i%sw:ghvŚ~ YS:7qU�F\}5CG-�.�_hMa0k,/8%5d4ԦZ}pX29>Z`nΩs`’'d`ˎ ?wԒw̷̄kk{;w X)kr !HT9f90KGq|ti^]#׫9M_  njSKWL}y=hI2$Qd:ʒdb9':@#>%M x Mde0_5GKʯQ ކxz,0ls'ߌMMJu۲~;Jٻ:gj] {PXV|H E$ ]m2\;yH,jKȻxdE]GJv"g\v�~JswTW0Rb`5BTnz15-̸![sz44(dkCs�᫉$%I׻^j_`re鹢�`~XEoZשoѡl{xuYhQhƒE%XhEd+Sa6˹ p`߫3tʴ|XR0cG|souS\i� \S;x`4RMOf{ɺ}JT,!*^J.UEa~!�(WM+?<ö\F�&΀y1`67IG~>4qjXG7(?ys1 ]Ăck~`ސm,|~)\gahgU(B5vEZ ˧ Dl'�Pɠ:mr8@6yJF//˖.V[o0kvCR>O~Vn\>Wuޣ-Gj/'wSu#.bВ~v:.iPIBXnImM(^ъ8yΆ^ZV#n)|9_] :Kﴮi9MKtpڋ7LVŊﺠ=B* h]U#kXO1@[>|3Nx1?-gN_DQF�&}3r/xse򺖱GhvS:ݵ7EWF͉/rxuPѧn0�aoWhygD< \Sf#�µ>ka(WC+�2V"່92 {<؃?\TT4,gjb7f2Su6G37ͧiKoK)-%m.o[Q(L 5({ 9u:Ԛ) VKzm̷C=ւV?^_2 -…D8U02,l@.Vx%SGH1>�60,hE.XњVuq\+V~asjE +[s*�oJ?2rOMv5+D)tv&�>6<&絟vݲq[VǦ[{tH#lxYkRS:Y=nNwޟk ZVa!z40繅DA??-Xp �oe?/SLj3ʳp<)BZ0%+6B`nP8GYg rT;?,,l喦KՇ ?<^9D8o2#FFN-{6 FCn}Og5d Aȧܕ_X y3/5%8 QUVetXj[OtIqO7{/uQ.1`Pp6uۑkkJrj`-=\?|?0cOwG+rrkX*Է9i,]T(_꾦t+KE`(ϣS7iwKp+%3_}1guǥt9\�'dkz䲺Kw,u,U*1SMqܳ D؁Ÿ ��C)]I^ <F 5˘y8Bq#оa^)@AxBLM{Xh |a*~ ,4kXt%^ f op%Be}O n9dP"X uzG5 Y`hpH)uE5-zthُQKu틽,Aё,t05'X䦲:@8XCqMߌyPUS*NԮRƴUnE ?"(pun푟x{ =NyV4P_=1b9,xϔ=KAQW7YE1OAM~_2?Ø:}H-i6=ü_A d# "ab?r`M4G0q9Gw{̻ R13_&:z具 ~fHv04Xe.U7xB$j+f]ߋ>uY4</UKNR'*w9v~b`)W@;z/"%':?bbG|ep0_HiLuצ4ʑO<%췢7vۑY龫Vv.^�/OI=tpY*S+Oߔ7%|֪?|I.D.G@JB4Ʃ_8̢{^=UwOݭKxI ڣ=MSO T| r =UFD.k Sl? DGs}'v;aukJ}~X< ){w0h*}2D-)oz.K[ Yso표U'UxKmOai֞ʕM[ lugD"<e)/= ,p)5GGTKV_E?ܢ\S:$�|钵j*s\.[X.ݳpFA&E/,j%w2;|G0Ts{?ͣ� <:s*_.&TV /~8$Vr)M(p'daa}:mBG% 21.EÚOWR1J�9ylыe͠j`CO l0cH};/ a^zIБgzs0)\nL׾}f!p LV2)2ʦ>\Hi!Y�+E<6qPߵgj$V;`XP2ЖǠX֣%vԭNn}9Mp듀KVٞ2[!I,%gWQ=h(5 ˜bŁZ]|P :"UA1!(΃x}uNG}Д8Qn%:mݦ ԓc)W^V6gT͵7cӘ/vJǵU= .zkV9qϨۖW|e)k8}W"XE'{fxrX@C�20\l w!09̛\I}xPn?q5kƐΉh*qB/qgX93;|QCyn`)ş.㉂A l~sE$ |O+ ( r}b{^.#4eN0ceB"u+H ZB%A{+xk塖fnëkܒ4 (ѥ>nw}c #,dekRǞ_TMW b8?>gV3 <{kɔ>B.v|U+ET_�5fKO,kܿxי2RCAֈ,除]Tƥg *˭:*S1}y\um Y^+ Z,/"OBT ) s<P.g=C #E0wDj&J5%xdc2O⊼”ڲZ陯.3{%YRle6bG<w%(/ ?ZJ|8bʲIHDdEZh^@Gm1_yYS[))6]x˷5+\*lx @ժ"m*l}jh V8cJ\31FE}yQ?@&D<Gui�0Ej<d 9tVA3?=:lԯ7PPL,!̛D`tmԟ8~:ףs,6u7rnmcJE#&ecZ_ʭ{fᕃO=ꅞ3oӗb3 >%ރB+u6=Bdz0Ns -%X D52<nWs* v݇ڒeNdI#|xII?櫴z=Á˂b׼ yyJK5s^Ra נyZbb#7 6�]ĀU'a meN O<Lf~I8#A&~nK 7 |\!CXkzi '<v<L[} Xη3ұYƴs�®OK1!ò.vCa!G,l5sHMP+TD^řp tPnᔾxT.zcETjiG)¯o)QJ]2ׁ s*gYzP"s\p&AyUlAvLQ[GT0vZF7xo6r!νwI?k\,,;V jl%:cfK�xgVmy<XCO\Ro4KFsuiٸu'$˕ A 4/a Tm /eQշ'+X^N�*�E"[�0Xk+.5,)[(OZ xk0σpwМ h0e=`(r;ád߫S<=AkiŊ*Dtnp5pXhor||,y >wapsx5GDf<i3tL9]gp!S:1qJq9 P.!'/]*̷|9*<WD[S[Řt.-ՒC Q\!1LUS/dk\>QG@BFɈ!qZ=jpoc tyS,dn1|DAd~ MDv�2h <|cgDb:0G/h"<,mw>˃T+uJ |kN:u% 9/%RJOLX[ s9(ɗppu))GљZv8nro{R:xR4tj9 tNmG/zZQtI'tҩ 0�f����IENDB`����������������������������������feincms-1.7.4/feincms/static/feincms/img/default-bg.gif���������������������������������������������0000664�0000000�0000000�00000001514�12122555434�0022767�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����㏰сʻ刪~ȃˀɡۍТ۸{ƈؚ̜͆{NJϟ٤ܮ℧˟ڶݧ޲䔴ԩ߶ɜ|Ȯ畴ԩߗ~Ȯᒲӫ|ȌДԱ㋬Η|Ǻ痶֑ӧފ}ǒҗդ܂ʬޚֻ匮Ы㙸֧ݻ}ǬႦʳᕳԌϚֆ̀ɒҪ߷ڐёҁʏѴ噸ם؜م̪̅߆ͺ華Ҹݩ˳査ٶ冩{Ʒ|Ƿ碽ۏұ݋~ɋ!�����,��������LDLDi77((7(k v'' xl !!YYqs!`FaaF`&PI&&pPp3{--%-%EA/NHQ/AQH/EH*nX *� Ԃ%3Bt,ЦC::"D~p`!>5r䠀(M*Xy2 2l�SfĬ0fĈ~C'$(U2 JňD+V>p`52Rr2>#Ǖs# �E@a5 cc1yx iAA3}(R?X2h @ UT)C ~8㿟�e9';@կ[I`;v,X@<D$xhbC~$8A؟�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/disclosure-down.png����������������������������������������0000664�0000000�0000000�00000000471�12122555434�0024116�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���Vu\���gAMA��OX2���tEXtSoftware�Adobe ImageReadyqe<���IDATxbdM@X�*7ė6= 0BH HPEF(Fdu! P5 ,P73h 3T'XaUٺoA�& 37c(AmaB\*t1&g ܄K 1d3Avo0W`l`m 91@ e j� � WUxw����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/disclosure-right.png���������������������������������������0000664�0000000�0000000�00000000467�12122555434�0024271�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���Vu\���gAMA��OX2���tEXtSoftware�Adobe ImageReadyqe<���IDATxbdM@X�*7ė6= 0BH HPEF@9X?|K`A MD954@݌L4$x݁ ;NcL*  \le01Xj '}`s373,qfl 9XI8A n ^�DV3a�0�1J|KYr����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/drag_order_circle.png��������������������������������������0000664�0000000�0000000�00000000373�12122555434�0024427�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ������sRGB����bKGD������ pHYs�� �� B4���tIME 0$`&���{IDATӍϱ@ DwW - )zN0%f<&a3I_R qw( <qW 3Z Έ@טېC`_!;-YA vZ}#5&6p����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/help.gif���������������������������������������������������0000664�0000000�0000000�00000003056�12122555434�0021710�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ���r1i�SE%7b�Io^D8F K \ͫCx�YY͓:mU"l}Ec3!aK\DRN�@;|j*c�QOEvZvYΚ�9H~"J>snL�>RŮZvc>줫 ,�<L=tdjHCyQ�9-e NE(p#a{S_w-P%dW DT߮*|�VU3|�\�B6p1S{{�DQ.qR?zuI}H}�D\[?C%Nl[\%_:ZN4<+7{t:|@p�:>6rUʳ׊F!O)^`^L` Rņ#g؏)c*iWf|!r7rzLlYnߖ% ؙ͋Ϙ%+^in;f\hj X^9?+jc _*]TjL`njAm-c=qX3~PX@HNVJx)X!�����,���� � ���' H*\p10` %|lšZ6hao.Ďh8Q]Ւk$c``F\ʑ$HH]sDX@F$ϙ+TP3q�Z"\ ISI` (d^ ~+d13i]I'N4@ƂDH9p�UgPh2y aq%s" ` 2#N* ,  BX��Ѭa*LPsW RC2)C"ĦV& ݀Bp‘W)AP9 @;ā 74 U@<0P%䡍a�� <3 aO rHf ˠA>[я Po@)bc!P&<Ps$H'#x (P@ Yq 1A',a$Y$YR@0D,ԁ,A! DB0d@*i7 iFi ͔H#]@ ) ( dJҚ<@у@!j0@"TAqe&tJ)T2DvM>4&ނ_AK 1e/)- H a$4:X 6�D30dr,X*|L"# ht+: H< (+M B|@("t,@ Q!$4 :s.�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/icon-no.gif������������������������������������������������0000664�0000000�0000000�00000000260�12122555434�0022314�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ��!!33..HH``bbXXZZuurr������������������������������������!���,���� � ��- @4(D@:@Ю1�A;p cM0ITa��;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/icon-unknown.gif�������������������������������������������0000664�0000000�0000000�00000000202�12122555434�0023373�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ��ѪՖ!���,���� � ��/=Z[LOS'(8C(G NuX5Ϙ@#��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/icon-yes.gif�����������������������������������������������0000664�0000000�0000000�00000000453�12122555434�0022504�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ��B?DA��mkަإki٧ȮܭtrکQOHFє]ZԜǂȀ~|٦ܮa^������������������������������������������������������������������������������������������!���,���� � ��H@P8 �4hz� (8ЀB�m.�t2(�Y$B\ UOJDA�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/icon_addlink.gif�������������������������������������������0000664�0000000�0000000�00000000167�12122555434�0023376�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � � �urdaead`eami_[{wEA������������������!�� �,���� � ��$0ID cq]V@Aԙ [Ay!eqxW�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/icon_deletelink.gif����������������������������������������0000664�0000000�0000000�00000000265�12122555434�0024107�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ��VWffNO^_FF_^__77^_ON>>+*rrVVrs0077ml+*vvWWNN������������������������!���,���� � ��2uYHi5Me @2QPviQiCH�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/important.gif����������������������������������������������0000664�0000000�0000000�00000002724�12122555434�0022776�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ���sggV6JK C=55zm%+\Qkk�F>Ա{{{XX,%닅::Ӣ$!\**�!}xݽ.)SKc**j++  93DDD 4�۸ʭ۝|fYV � ''Ϯ92 iCC * <#�{zrqqU**61 A&�+'ff3.---00Ğ迿ٵeejTʩ1.C%P4kjkdq{|q1,᫫gggH@q((ܬ@>w66^hiY??**@dKgg1,,yWWd�??ҐՌƧǨm""׶߽Y@@ HCѭޫkg?9=7䷷侾�� ͑1'vv84;;dd``jj[A�}III-֌}EE~~OO!�����,���� � ���H*\0ɊA�1  <̍8FcPSZK & cP9` ɐe?=" Z tGJR?b@kB^@ &OJѰ5j8P4= h@$4T (%P4H͌4 d*�i7o�#BD{({JW ~^K=,hb12T ~@P* %yrAC!eaC؏Z$}!a2:Ţ%O>>( S:x&LQ=<2PfI-`q@CQP4 7[ !%!d  a68h1a5*`@�DD��;:8P .#ANCO A ;Q� ;8@ALB8 L p9hDЎs e(0 T?\Ems�p4 R{r~`H!E�Vd#C <P34X3p TM4KvDŴ8g{9 ~A>q!A[k {q5 ;pD ~n(1p+$BEBHy'D;G#7t1 7 2 ,'kr\14l5@@W%�;��������������������������������������������feincms-1.7.4/feincms/static/feincms/img/info.gif���������������������������������������������������0000664�0000000�0000000�00000002717�12122555434�0021716�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ���@]=r!T_-d�=J} [iڧK6m_4kBBiM.b dщ:卵K�X�N˚�Ją47SmUˋ▽ %�@/hɱ\JAyCwH3r�9{섮; I~1{돽tTZK}{�><f �R�B>a�V^�[WEySeP̞~~�EBwP *"F.fӑ L<ZR',�U;)aқj}qe憊èsNYQQ<qjjm[ioXdGbIB[P7P�D/w J 3 '/M CA'`~(�Tᚧj;>wc:wcV1Ph6q8n꘿V O1N@x�FHHs;UY\_q:p)['`0{$h*iHtpx~&kwb2w7v-fԁ�W?PTZ4o T IT>'m�;�:^`qL@K L M�0;qOׇ`?|b!�����,���� � ���/ H*\ȰCM2H4Ң<=,8&K["@\mÀRF4kƈ C?\QF*rI,Z,GW! ,L?hAD=itO 0кI_/Y0rWŦ8đV+v&.A@7) ʥI` dɃ{d&jɰx1ٳd#CW@L.anx ބ5"<` Dv6+ؐ ֠`"!Ѓai07 ppABZ J|/جq|SEsD  )a*w1SLĉ)�t1H!>gH.<�'SP„`!4 e(0eN<$@Y&,a�N BaP0Rt9l>6DA(?R9dPAq mf'U-LP8P 0DDBzq $_&4HA+;Hh($(5.3ӄcR BC ҂&D+1*TR�4D&I1pt1O$# DAȼD�H"DaJG'1 (l8�;�������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/item_editor_form_title.png���������������������������������0000664�0000000�0000000�00000005075�12122555434�0025532�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��������|ɥ���sRGB����bKGD������ pHYs�� �� ����tIME 6#�� IDATxM%WൠN؁Juc;1(iW Q!6AD I4("~GqrΩs>ԁwUU7RJ)RJ)RJ)RJ)RJ)RJs׍Ȩc_WGFTF`dD! ҏAlD2 2EA2* Ku  lOODyE;UD?ztČZn# ҍA3  L 11/ A  l߼ S͇7Sy#  }Ay[2 2(1# Kb^@F&@A;1g! lzU]ˏ./:ZG A  \ ,ydJAY  VIֿbms\=l|[F@ t%"BI2$  #0# ]8Ȁ  d AAd$N:?o$*>AGD ҙTHAA2# RA&@A?1g! lo3Wo_XdV1}o" ҍA3 l"KJ %"dH" AdAA{1ƷU :~8ꡑ  A-AA%20 r|AAJ_=2*2r޳WW[-~e1  HҞ\ H_"A̟I A,ߐA |AAD-23+O|"">"㫋vTE4Rh_DA HordAd0QRBAҼ H@AVC  U/YYdD<rND<wxwmmDdf7_  H""AD2 28 $AF$@AVBb5  l ?KD{n"J  ׄA'  M\g! 'D8ȀD z|AA6I?.xs  !"BM$  RBA. ci  k!.AAKw<|Ɉ:9SAADD =dAdh"%Ady(d@" Ad-D>  %7vE{n{DdFb>DZ  "!"A  Ȱ$ pH줁 LL>  %O >s|-Z貱y AAMJD ݉dAdl: AY2"AY  Vɳ?42}-j'Q95# r~"BN$  c)! "dHn,# +!  U_z>xVE{x[X=?Ha^AA~DD dAdl"%A8AABY  %7.v5ASEfUefĮ*#kjz波 _U  H?ҔA:  DJ )2 qcAY  ݗik%sϜ̻%ADD dAd|"%AdE8ȐD Z|AA6K?x;bhT,F2/GA$SD dAdx"%AdO2R8ȐD *HAAd$o/>""rxDeeSO}>QsAA^DD ݉{Ad#DJ H HAY  6ɍn\}Q-b!u~V  Hw""AD2 20 )! AF$@AA  Qޯ[g|e|,ߞޟ_X  r=A@$  )! !dXAY  fI~滿:߾ohG! A3  YRBApAd5gbAA*ɧ^|3**_&"Gx;.YGS;}  ҍTAD2 2< HAYǙ|AAJ o__݈xχo~C7~G_ůG{  ҋA' M ,/�G AAd$?tqyت! r-A:  M H\d i  k Q%AAmw熑YUF:}}  #!"AD2 2: rL H LL>  $y[DFgs{,O \ %"AD2 26 $A$n,# +!AA,.0*-����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/nav-bg.gif�������������������������������������������������0000664�0000000�0000000�00000000421�12122555434�0022123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������������������������!�����,������� &dihlW,tmD|.(bal:tJ:ج zneL.ǐzNP|   !�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/selector-search.gif����������������������������������������0000664�0000000�0000000�00000001050�12122555434�0024033�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����<<<III@@@KKKLLL:::eee888>>>jjj666ӫXXXGGG```CCCEEE}}}ccc[[[lll___乹SSSԪNNNfffŚUUU{{{ZZZ~~~???|||iii^^^ႂdddAAA���������������������������������������������������������������������������������������������������������������������������������������������������������������������������!����,��������!4- ><  +  ,A1"%:?0&.*'@DE3B92 ;#7 C= �F $ 8 (5/6) �;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/title.gif��������������������������������������������������0000664�0000000�0000000�00000000475�12122555434�0022103�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������������!�����,�������Z@pH !�94h4WY,*L44 Wmp7Xl R EVĒ' : (/526"'4A�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/img/wrench.png�������������������������������������������������0000664�0000000�0000000�00000001142�12122555434�0022257�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���gAMA��7���tEXtSoftware�Adobe ImageReadyqe<��IDAT8˕oQ_[c+W.]хi5  g mJ[Fq#_)qո;,@{;u�pLTʙH$(Z XMɤni"\nt:}yD <ou]q},5QXjP*DޅB!5ɠlX2|XPVQ( IEAXk ί:lU*h{-PU,n Y>0 \ ږIU4(r HMk̈_4_ziy'"[ n1rM_A`b�=$Ik_p-qS~=li~3Bv"qZAԧ̸r[G]<&e!'ڸ67 yq$OX!=_~1Gs~EZQx&qWK3!ޤunkzGrjQn����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/item_editor.js�������������������������������������������������0000664�0000000�0000000�00000056525�12122555434�0022370�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������if(!Array.indexOf) { Array.prototype.indexOf = function(obj) { for(var i=0; i<this.length; i++) { if(this[i]==obj) { return i; } } return -1; }; } (function($){ // Patch up urlify maps to generate nicer slugs in german if(typeof(Downcoder) != "undefined"){ Downcoder.Initialize() ; Downcoder.map["ö"] = Downcoder.map["Ö"] = "oe"; Downcoder.map["ä"] = Downcoder.map["Ä"] = "ae"; Downcoder.map["ü"] = Downcoder.map["Ü"] = "ue"; } function feincms_gettext(s) { // Unfortunately, we cannot use Django's jsi18n view for this // because it only sends translations from the package // "django.conf" -- our own djangojs domain strings won't be // picked up if (FEINCMS_ITEM_EDITOR_GETTEXT[s]) return FEINCMS_ITEM_EDITOR_GETTEXT[s]; return s; } function create_new_item_from_form(form, modname, modvar){ var fieldset = $("<fieldset>").addClass("module aligned order-item item-wrapper-" + modvar); var wrp = []; wrp.push('<h2><img class="item-delete" src="'+IMG_DELETELINK_PATH+'" /><span class="handle"></span> <span class="modname">'+modname+'</span>  (<span class="collapse">'+feincms_gettext('Hide')+'</span>)</h2>'); wrp.push('<div class="item-content"></div>'); fieldset.append(wrp.join("")); fieldset.children(".item-content").append(form); //relocates, not clone $("<div>").addClass("item-controls").appendTo(fieldset); return fieldset; } SELECTS = {}; function save_content_type_selects() { $('#main>.panel').each(function() { SELECTS[this.id.replace(/_body$/, '')] = $("select[name=order-machine-add-select]", this).clone().removeAttr("name"); }); } function update_item_controls(item, target_region_id){ var item_controls = item.find(".item-controls"); item_controls.find(".item-control-units").remove(); // Remove all controls, if any. // (Re)build controls var control_units = $("<div>").addClass("item-control-units").appendTo(item_controls); // Insert control unit var insert_control = $("<div>").addClass("item-control-unit"); var select_content = SELECTS[REGION_MAP[target_region_id]].clone(); var insert_after = $("<input>").attr("type", "button").addClass("button").attr("value", feincms_gettext('After')).click(function(){ var modvar = select_content.val(); var modname = select_content.find("option:selected").html(); var new_fieldset = create_new_fieldset_from_module(modvar, modname); add_fieldset(target_region_id, new_fieldset, {where:'insertAfter', relative_to:item, animate:true}); update_item_controls(new_fieldset, target_region_id); }); var insert_before = $("<input>").attr("type", "button").addClass("button").attr("value", feincms_gettext('Before')).click(function(){ var modvar = select_content.val(); var modname = select_content.find("option:selected").html(); var new_fieldset = create_new_fieldset_from_module(modvar, modname); add_fieldset(target_region_id, new_fieldset, {where:'insertBefore', relative_to:item, animate:true}); update_item_controls(new_fieldset, target_region_id); }); insert_control.append("<span>" + feincms_gettext('Insert new:') + "</span>").append(" ").append(select_content).append(" ").append(insert_before).append(insert_after); control_units.append(insert_control); // Move control unit if (REGION_MAP.length > 1) { var wrp = []; wrp.push('<div class="item-control-unit move-control"><span>'+feincms_gettext('Move to')+': </span><select name="item-move-select">'); for (var i=0; i < REGION_MAP.length; i++) { if (i != target_region_id) { // Do not put the target region in the list wrp.push('<option value="'+REGION_MAP[i]+'">'+REGION_NAMES[i]+'</option>'); } } wrp.push('</select><input type="button" class="button" value="'+feincms_gettext('Move')+'" /></div>'); var move_control = $(wrp.join("")); move_control.find(".button").click(function(){ var move_to = $(this).prev().val(); move_item(REGION_MAP.indexOf(move_to), item); }); control_units.append(move_control); // Add new one } // Controls animations item_controls.find("*").hide(); var is_hidden = true; var mouseenter_timeout; var mouseleave_timeout; function hide_controls() { item_controls.find("*").fadeOut(800); is_hidden = true; } function show_controls() { item_controls.find("*").fadeIn(800); is_hidden = false; } item_controls.unbind('mouseleave'); // Unbind in case it's already been bound. item_controls.mouseleave(function() { clearTimeout(mouseenter_timeout); mouseleave_timeout = setTimeout(hide_controls, 1000); }); item_controls.unbind('mouseenter'); // Unbind in case it's already been bound. item_controls.mouseenter(function() { clearTimeout(mouseleave_timeout); if (is_hidden) mouseenter_timeout = setTimeout(show_controls, 200); // To prevent the control bar to appear when mouse accidentally enters the zone. }); } function create_new_fieldset_from_module(modvar, modname) { var new_form = create_new_spare_form(modvar); return create_new_item_from_form(new_form, modname, modvar); } function add_fieldset(region_id, item, how){ /* `how` should be an object. `how.where` should be one of: - 'append' -- last region - 'prepend' -- first region - 'insertBefore' -- insert before relative_to - 'insertAfter' -- insert after relative_to */ // Default parameters if (how) $.extend({ where: 'append', relative_to: undefined, animate: false }, how); item.hide(); if(how.where == 'append' || how.where == 'prepend'){ $("#"+ REGION_MAP[region_id] +"_body").children("div.order-machine")[how.where](item); } else if(how.where == 'insertBefore' || how.where == 'insertAfter'){ if(how.relative_to){ item[how.where](how.relative_to); } else{ window.alert('DEBUG: invalid add_fieldset usage'); return; } } else{ window.alert('DEBUG: invalid add_fieldset usage'); return; } set_item_field_value(item, "region-choice-field", region_id); init_contentblocks(); if (how.animate) { item.fadeIn(800); } else { item.show(); } } function create_new_spare_form(modvar) { var old_form_count = parseInt($('#id_'+modvar+'_set-TOTAL_FORMS').val(), 10); // **** UGLY CODE WARNING, avert your gaze! **** // for some unknown reason, the add-button click handler function // fails on the first triggerHandler call in some rare cases; // we can detect this here and retry: for(var i = 0; i < 2; i++){ // Use Django's built-in inline spawing mechanism (Django 1.2+) // must use django.jQuery since the bound function lives there: django.jQuery('#'+modvar+'_set-group').find( 'div.add-row > a').triggerHandler('click'); var new_form_count = parseInt($('#id_'+modvar+'_set-TOTAL_FORMS').val(), 10); if(new_form_count > old_form_count){ return $('#'+modvar+'_set-'+(new_form_count-1)); } } } function set_item_field_value(item, field, value) { // item: DOM object for the item's fieldset. // field: "order-field" | "delete-field" | "region-choice-field" if (field=="delete-field") item.find("."+field).attr("checked",value); else if (field=="region-choice-field") { var old_region_id = REGION_MAP.indexOf(item.find("."+field).val()); item.find("."+field).val(REGION_MAP[value]); old_region_item = $("#"+REGION_MAP[old_region_id]+"_body"); if (old_region_item.children("div.order-machine").children().length == 0) old_region_item.children("div.empty-machine-msg").show(); else old_region_item.children("div.empty-machine-msg").hide(); new_region_item = $("#"+REGION_MAP[value]+"_body"); new_region_item.children("div.empty-machine-msg").hide(); } else item.find("."+field).val(value); } function move_item(region_id, item) { poorify_rich(item); item.fadeOut(800, function() { add_fieldset(region_id, item, {where:'append'}); richify_poor(item); update_item_controls(item, region_id); item.show(); }); } function poorify_rich(item){ item.children(".item-content").hide(); for (var i=0; i<contentblock_move_handlers.poorify.length; i++) contentblock_move_handlers.poorify[i](item); } function richify_poor(item){ item.children(".item-content").show(); for (var i=0; i<contentblock_move_handlers.richify.length; i++) contentblock_move_handlers.richify[i](item); } function sort_by_ordering(e1, e2) { var v1 = parseInt($('.order-field', e1).val(), 10) || 0; var v2 = parseInt($('.order-field', e2).val(), 10) || 0; return v1 > v2 ? 1 : -1; } function give_ordering_to_content_types() { for (var i=0; i<REGION_MAP.length;i++) { var container = $("#"+REGION_MAP[i]+"_body div.order-machine"); for (var j=0; j<container.children().length; j++) { set_item_field_value(container.find("fieldset.order-item:eq("+j+")"), "order-field", j); } } } function order_content_types_in_regions() { for (var i=0; i<REGION_MAP.length;i++) { var container = $("#"+REGION_MAP[i]+"_body div.order-machine"); container.children().sort(sort_by_ordering).each(function() { container.append(this); }); } } function init_contentblocks() { for(var i=0; i<contentblock_init_handlers.length; i++) contentblock_init_handlers[i](); } function hide_form_rows_with_hidden_widgets(){ /* This is not normally done in django -- the fields are shown with visible labels and invisible widgets, but FeinCMS used to use custom form rendering to hide rows for hidden fields. This is an attempt to preserve that behaviour. */ $('div.feincms_inline div.form-row').each(function(){ var child_count = $(this).find('*').length; var invisible_types = 'div, label, input[type=hidden], p.help'; var invisible_count = $(this).find(invisible_types).length; if(invisible_count == child_count){ $(this).addClass('hidden-form-row'); } }); } function init_content_type_buttons() { $('#main > .panel').each(function() { var $select = $('select[name=order-machine-add-select]', this), to_remove = []; for (var i=0; i<CONTENT_TYPE_BUTTONS.length; i++) { var c = CONTENT_TYPE_BUTTONS[i], $option = $select.find('option[value=' + c.type + ']'); if (!$option.length) continue; var $button = $('<a href="#" class="actionbutton" />'); $button.attr('title', CONTENT_NAMES[c.type]); $button.addClass(c.cssclass ? c.cssclass : c.type).bind('click', (function(c) { return function() { var fieldset = ItemEditor.add_content_to_current(c.type); if (c.raw_id_picker) { var id = fieldset.find('.related-lookup, span.mediafile').attr('id'); if (id) { window.open(c.raw_id_picker, id_to_windowname(id.replace(/^lookup_/, '')), 'height=500,width=800,resizable=yes,scrollbars=yes').focus(); } } if (c.after) c.after.call(null, fieldset); return false; }; })(c)); $select.before($button); if (!c.keep) to_remove.push($option); } for (var i=0; i<to_remove.length; i++) to_remove[i].remove(); if ($select.find('option').length == 0) { // hide the content type select box and the add button if // the dropdown is empty now $select.hide().next().hide(); } }); } // global variable holding the current template key var current_template; $(document).ready(function($){ hide_form_rows_with_hidden_widgets(); $("#main_wrapper > .navi_tab").click(function(){ var elem = $(this); $("#main_wrapper > .navi_tab").removeClass("tab_active"); elem.addClass("tab_active"); $("#main > div:visible, #main > fieldset:visible").hide(); var tab_str = elem.attr("id").substr(0, elem.attr("id").length-4); $('#'+tab_str+'_body').show(); ACTIVE_REGION = REGION_MAP.indexOf(tab_str); // make it possible to open current tab on page reload window.location.replace('#tab_'+tab_str); }); // save content type selects for later use save_content_type_selects(); $("input.order-machine-add-button").click(function(){ var select_content = $(this).prev(); var modvar = select_content.val(); // bail out early if no content type selected if (!modvar) return; var modname = select_content.find("option:selected").html(); var new_fieldset = create_new_fieldset_from_module(modvar, modname); add_fieldset(ACTIVE_REGION, new_fieldset, {where:'append', animate:true}); update_item_controls(new_fieldset, ACTIVE_REGION); }); $("h2 img.item-delete").live('click', function(){ var popup_bg = '<div class="popup_bg"></div>'; $("body").append(popup_bg); var item = $(this).parents(".order-item"); jConfirm(DELETE_MESSAGES[0], DELETE_MESSAGES[1], function(r) { if (r==true) { var in_database = item.find(".delete-field").length; if(in_database==0){ // remove on client-side only // decrement TOTAL_FORMS: var id = item.find(".item-content > div").attr('id'); var modvar = id.replace(/_set-\d+$/, ''); var count = $('#id_'+modvar+'_set-TOTAL_FORMS').val(); // remove form: item.find(".item-content").remove(); // could trigger django's deletion handler, which would // handle reindexing other inlines, etc, but seems to // cause errors, and is apparently unnecessary... // django.jQuery('#'+id).find('a.inline-deletelink') // .triggerHandler('click'); } else{ // saved on server, don't remove form set_item_field_value(item,"delete-field","checked"); } item.fadeOut(200, function() { var region_item = $("#"+REGION_MAP[ACTIVE_REGION]+"_body"); if (region_item.children("div.order-machine").children(":visible").length == 0) { region_item.children("div.empty-machine-msg").show(); } }); } $(".popup_bg").remove(); }); }); $('h2 span.collapse').live('click', function(){ var node = this; $(this.parentNode.parentNode).children('.item-content').slideToggle(function(){ $(node).text(feincms_gettext($(this).is(':visible') ? 'Hide' : 'Show')); }); return false; }); current_template = $('input[name=template_key][checked], select[name=template_key]').val(); function on_template_key_changed(){ var input_element = this; var new_template = this.value; if(current_template==new_template) // Selected template did not change return false; var current_regions = template_regions[current_template]; var new_regions = template_regions[new_template]; var not_in_new = []; for(var i=0; i<current_regions.length; i++) if(new_regions.indexOf(current_regions[i])==-1) not_in_new.push(current_regions[i]); var popup_bg = '<div id="popup_bg"></div>'; $("body").append(popup_bg); var msg = CHANGE_TEMPLATE_MESSAGES[1]; if(not_in_new.length) { msg = interpolate(CHANGE_TEMPLATE_MESSAGES[2], { 'source_regions': not_in_new, 'target_region': new_regions[0] }, true); } jConfirm(msg, CHANGE_TEMPLATE_MESSAGES[0], function(ret) { if(ret) { for(var i=0; i<not_in_new.length; i++) { var body = $('#' + not_in_new[i] + '_body'), machine = body.find('.order-machine'), inputs = machine.find('input[name$=region]'); inputs.val(new_regions[0]); } input_element.checked = true; $('#page_form').append('<input type="hidden" name="_continue" value="1" />'); /* Simulate a click on the save button instead of form.submit(), so that the submit handlers from FilteredSelectMultiple get invoked. See Issue #372 */ $('#page_form input[type=submit][name=_save]').click(); } else { $("div#popup_bg").remove(); $(input_element).val($(input_element).data('original_value')); // Restore original value } }); return false; } // The template key's widget could either be a radio button or a drop-down select. var template_key_radio = $('input[type=radio][name=template_key]'); template_key_radio.click(on_template_key_changed); var template_key_select = $('select[name=template_key]'); template_key_select.change(on_template_key_changed); // Save template key's original value for easy restore if the user cancels the change. template_key_radio.data('original_value', template_key_radio.val()); template_key_select.data('original_value', template_key_select.val()); $('form').submit(function(){ give_ordering_to_content_types(); var form = $(this); form.attr('action', form.attr('action')+window.location.hash); return true; }); // move contents into their corresponding regions and do some simple formatting $("div.feincms_inline div.inline-related").each(function(){ var elem = $(this); if (elem.find("span.delete input").attr("checked")) { // ignore all inlines that are set to be deleted by reversion return; } elem.find("input[name$=-region]").addClass("region-choice-field"); elem.find("input[name$=-DELETE]").addClass("delete-field"); elem.find("input[name$=-ordering]").addClass("order-field"); if (!elem.hasClass("empty-form")){ var region_id = REGION_MAP.indexOf( elem.find(".region-choice-field").val()); if (REGION_MAP[region_id] != undefined) { var content_type = elem.attr("id").substr( 0, elem.attr("id").indexOf("_")); var item = create_new_item_from_form( elem, CONTENT_NAMES[content_type], content_type); add_fieldset(region_id, item, {where:'append'}); update_item_controls(item, region_id); } } }); // register regions as sortable for drag N drop $(".order-machine").sortable({ handle: '.handle', helper: function(event, ui){ var h2 = $("<h2>").html($(ui.item).find('span.modname').html()); return $("<fieldset>").addClass("helper module").append(h2); }, placeholder: 'highlight', start: function(event, ui) { poorify_rich($(ui.item)); }, stop: function(event, ui) { richify_poor($(ui.item)); } }); order_content_types_in_regions(); // hide now-empty formsets $('div.feincms_inline').hide(); // add quick buttons to order machine control init_content_type_buttons(); // DRY object-tools addition $(".extra-object-tools li").appendTo("ul.object-tools"); $(".extra-object-tools").remove(); /* handle Cmd-S and Cmd-Shift-S as save-and-continue and save respectively */ $(document.documentElement).keydown(function(event) { if(event.which == 83 && event.metaKey) { sel = event.shiftKey ? 'form:first input[name=_continue]' : 'form:first input[name=_save]'; $(sel).click(); return false; } }); var errors = $('#main div.errors'); if(errors.length) { var id = errors.parents('fieldset[id$=_body], div[id$=_body]').attr('id'); $('#'+id.replace('_body', '_tab')).trigger('click'); } else { if(window.location.hash) { var tab = $('#'+window.location.hash.substr(5)+'_tab'); if(tab.length) { tab.trigger('click'); return; } } $('#main_wrapper>div.navi_tab:first-child').trigger('click'); } }); $(window).load(function(){init_contentblocks();}); // externally accessible helpers window.ItemEditor = { add_content: function(type, region) { var new_fieldset = create_new_fieldset_from_module(type, CONTENT_NAMES[type]); add_fieldset(region, new_fieldset, {where: 'append', animate: 'true'}); update_item_controls(new_fieldset, region); return new_fieldset; }, add_content_to_current: function(type) { return ItemEditor.add_content(type, ACTIVE_REGION); } }; })(feincms.jQuery); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/jquery-1.8.3.min.js��������������������������������������������0000664�0000000�0000000�00000266705�12122555434�0022635�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! jQuery v1.8.3 jquery.com | jquery.org/license */ (function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);�����������������������������������������������������������feincms-1.7.4/feincms/static/feincms/jquery-ui-1.8.22.custom.min.js���������������������������������0000775�0000000�0000000�00000625516�12122555434�0024644�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.core.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.22",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a("<a>").outerWidth(1).jquery||a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.curCSS||(a.curCSS=a.css),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;return b[d]>0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.widget.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){return c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}}),d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;return e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e,f&&e.charAt(0)==="_"?h:(f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b)return h=f,!1}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))}),h)}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}return this._setOptions(e),this},_setOptions:function(b){var c=this;return a.each(b,function(a,b){c._setOption(a,b)}),this},_setOption:function(a,b){return this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);return this.element.trigger(c,d),!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.mouse.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent"))return a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(b){if(c)return;this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted)return b.preventDefault(),!0}return!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0,!0},_mouseMove:function(b){return!a.browser.msie||document.documentMode>=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.position.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.draggable.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.left<h[0]&&(f=h[0]+this.offset.click.left),b.pageY-this.offset.click.top<h[1]&&(g=h[1]+this.offset.click.top),b.pageX-this.offset.click.left>h[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.top<h[1]||j-this.offset.click.top>h[3]?j-this.offset.click.top<h[1]?j+c.grid[1]:j-c.grid[1]:j:j;var k=c.grid[0]?this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0]:this.originalPageX;f=h?k-this.offset.click.left<h[0]||k-this.offset.click.left>h[2]?k-this.offset.click.left<h[0]?k+c.grid[0]:k-c.grid[0]:k:k}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(b,c,d){return d=d||this._uiHash(),a.ui.plugin.call(this,b,[c,d]),b=="drag"&&(this.positionAbs=this._convertPositionTo("absolute")),a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(a){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),a.extend(a.ui.draggable,{version:"1.8.22"}),a.ui.plugin.add("draggable","connectToSortable",{start:function(b,c){var d=a(this).data("draggable"),e=d.options,f=a.extend({},c,{item:d.element});d.sortables=[],a(e.connectToSortable).each(function(){var c=a.data(this,"sortable");c&&!c.options.disabled&&(d.sortables.push({instance:c,shouldRevert:c.options.revert}),c.refreshPositions(),c._trigger("activate",b,f))})},stop:function(b,c){var d=a(this).data("draggable"),e=a.extend({},c,{item:d.element});a.each(d.sortables,function(){this.instance.isOver?(this.instance.isOver=0,d.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(b),this.instance.options.helper=this.instance.options._helper,d.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",b,e))})},drag:function(b,c){var d=a(this).data("draggable"),e=this,f=function(b){var c=this.offset.click.top,d=this.offset.click.left,e=this.positionAbs.top,f=this.positionAbs.left,g=b.height,h=b.width,i=b.top,j=b.left;return a.ui.isOver(e+c,f+d,i,j,g,h)};a.each(d.sortables,function(f){this.instance.positionAbs=d.positionAbs,this.instance.helperProportions=d.helperProportions,this.instance.offset.click=d.offset.click,this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=a(e).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return c.helper[0]},b.target=this.instance.currentItem[0],this.instance._mouseCapture(b,!0),this.instance._mouseStart(b,!0,!0),this.instance.offset.click.top=d.offset.click.top,this.instance.offset.click.left=d.offset.click.left,this.instance.offset.parent.left-=d.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=d.offset.parent.top-this.instance.offset.parent.top,d._trigger("toSortable",b),d.dropped=this.instance.element,d.currentItem=d.element,this.instance.fromOutside=d),this.instance.currentItem&&this.instance._mouseDrag(b)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",b,this.instance._uiHash(this.instance)),this.instance._mouseStop(b,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),d._trigger("fromSortable",b),d.dropped=!1)})}}),a.ui.plugin.add("draggable","cursor",{start:function(b,c){var d=a("body"),e=a(this).data("draggable").options;d.css("cursor")&&(e._cursor=d.css("cursor")),d.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;d._cursor&&a("body").css("cursor",d._cursor)}}),a.ui.plugin.add("draggable","opacity",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("opacity")&&(e._opacity=d.css("opacity")),d.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;d._opacity&&a(c.helper).css("opacity",d._opacity)}}),a.ui.plugin.add("draggable","scroll",{start:function(b,c){var d=a(this).data("draggable");d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"&&(d.overflowOffset=d.scrollParent.offset())},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=!1;if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"){if(!e.axis||e.axis!="x")d.overflowOffset.top+d.scrollParent[0].offsetHeight-b.pageY<e.scrollSensitivity?d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop+e.scrollSpeed:b.pageY-d.overflowOffset.top<e.scrollSensitivity&&(d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop-e.scrollSpeed);if(!e.axis||e.axis!="y")d.overflowOffset.left+d.scrollParent[0].offsetWidth-b.pageX<e.scrollSensitivity?d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft+e.scrollSpeed:b.pageX-d.overflowOffset.left<e.scrollSensitivity&&(d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft-e.scrollSpeed)}else{if(!e.axis||e.axis!="x")b.pageY-a(document).scrollTop()<e.scrollSensitivity?f=a(document).scrollTop(a(document).scrollTop()-e.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<e.scrollSensitivity&&(f=a(document).scrollTop(a(document).scrollTop()+e.scrollSpeed));if(!e.axis||e.axis!="y")b.pageX-a(document).scrollLeft()<e.scrollSensitivity?f=a(document).scrollLeft(a(document).scrollLeft()-e.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<e.scrollSensitivity&&(f=a(document).scrollLeft(a(document).scrollLeft()+e.scrollSpeed))}f!==!1&&a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(d,b)}}),a.ui.plugin.add("draggable","snap",{start:function(b,c){var d=a(this).data("draggable"),e=d.options;d.snapElements=[],a(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var b=a(this),c=b.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:b.outerWidth(),height:b.outerHeight(),top:c.top,left:c.left})})},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=e.snapTolerance,g=c.offset.left,h=g+d.helperProportions.width,i=c.offset.top,j=i+d.helperProportions.height;for(var k=d.snapElements.length-1;k>=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f<g&&g<m+f&&n-f<i&&i<o+f||l-f<g&&g<m+f&&n-f<j&&j<o+f||l-f<h&&h<m+f&&n-f<i&&i<o+f||l-f<h&&h<m+f&&n-f<j&&j<o+f)){d.snapElements[k].snapping&&d.options.snap.release&&d.options.snap.release.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=!1;continue}if(e.snapMode!="inner"){var p=Math.abs(n-j)<=f,q=Math.abs(o-i)<=f,r=Math.abs(l-h)<=f,s=Math.abs(m-g)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n-d.helperProportions.height,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l-d.helperProportions.width}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m}).left-d.margins.left)}var t=p||q||r||s;if(e.snapMode!="outer"){var p=Math.abs(n-i)<=f,q=Math.abs(o-j)<=f,r=Math.abs(l-g)<=f,s=Math.abs(m-h)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o-d.helperProportions.height,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m-d.helperProportions.width}).left-d.margins.left)}!d.snapElements[k].snapping&&(p||q||r||s||t)&&d.options.snap.snap&&d.options.snap.snap.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=p||q||r||s||t}}}),a.ui.plugin.add("draggable","stack",{start:function(b,c){var d=a(this).data("draggable").options,e=a.makeArray(a(d.stack)).sort(function(b,c){return(parseInt(a(b).css("zIndex"),10)||0)-(parseInt(a(c).css("zIndex"),10)||0)});if(!e.length)return;var f=parseInt(e[0].style.zIndex)||0;a(e).each(function(a){this.style.zIndex=f+a}),this[0].style.zIndex=f+e.length}}),a.ui.plugin.add("draggable","zIndex",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("zIndex")&&(e._zIndex=d.css("zIndex")),d.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;d._zIndex&&a(c.helper).css("zIndex",d._zIndex)}})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.droppable.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect"},_create:function(){var b=this.options,c=b.accept;this.isover=0,this.isout=1,this.accept=a.isFunction(c)?c:function(a){return a.is(c)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},a.ui.ddmanager.droppables[b.scope]=a.ui.ddmanager.droppables[b.scope]||[],a.ui.ddmanager.droppables[b.scope].push(this),b.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++)b[c]==this&&b.splice(c,1);return this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable"),this},_setOption:function(b,c){b=="accept"&&(this.accept=a.isFunction(c)?c:function(a){return a.is(c)}),a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),c&&this._trigger("activate",b,this.ui(c))},_deactivate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),c&&this._trigger("deactivate",b,this.ui(c))},_over:function(b){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return;this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",b,this.ui(c)))},_out:function(b){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return;this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",b,this.ui(c)))},_drop:function(b,c){var d=c||a.ui.ddmanager.current;if(!d||(d.currentItem||d.element)[0]==this.element[0])return!1;var e=!1;return this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var b=a.data(this,"droppable");if(b.options.greedy&&!b.options.disabled&&b.options.scope==d.options.scope&&b.accept.call(b.element[0],d.currentItem||d.element)&&a.ui.intersect(d,a.extend(b,{offset:b.element.offset()}),b.options.tolerance))return e=!0,!1}),e?!1:this.accept.call(this.element[0],d.currentItem||d.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",b,this.ui(d)),this.element):!1},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}}),a.extend(a.ui.droppable,{version:"1.8.22"}),a.ui.intersect=function(b,c,d){if(!c.offset)return!1;var e=(b.positionAbs||b.position.absolute).left,f=e+b.helperProportions.width,g=(b.positionAbs||b.position.absolute).top,h=g+b.helperProportions.height,i=c.offset.left,j=i+c.proportions.width,k=c.offset.top,l=k+c.proportions.height;switch(d){case"fit":return i<=e&&f<=j&&k<=g&&h<=l;case"intersect":return i<e+b.helperProportions.width/2&&f-b.helperProportions.width/2<j&&k<g+b.helperProportions.height/2&&h-b.helperProportions.height/2<l;case"pointer":var m=(b.positionAbs||b.position.absolute).left+(b.clickOffset||b.offset.click).left,n=(b.positionAbs||b.position.absolute).top+(b.clickOffset||b.offset.click).top,o=a.ui.isOver(n,m,k,i,c.proportions.height,c.proportions.width);return o;case"touch":return(g>=k&&g<=l||h>=k&&h<=l||g<k&&h>l)&&(e>=i&&e<=j||f>=i&&f<=j||e<i&&f>j);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h<d.length;h++){if(d[h].options.disabled||b&&!d[h].accept.call(d[h].element[0],b.currentItem||b.element))continue;for(var i=0;i<f.length;i++)if(f[i]==d[h].element[0]){d[h].proportions.height=0;continue g}d[h].visible=d[h].element.css("display")!="none";if(!d[h].visible)continue;e=="mousedown"&&d[h]._activate.call(d[h],c),d[h].offset=d[h].element.offset(),d[h].proportions={width:d[h].element[0].offsetWidth,height:d[h].element[0].offsetHeight}}},drop:function(b,c){var d=!1;return a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(!this.options)return;!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)&&(d=this._drop.call(this,c)||d),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],b.currentItem||b.element)&&(this.isout=1,this.isover=0,this._deactivate.call(this,c))}),d},dragStart:function(b,c){b.element.parents(":not(body,html)").bind("scroll.droppable",function(){b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)})},drag:function(b,c){b.options.refreshPositions&&a.ui.ddmanager.prepareOffsets(b,c),a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible)return;var d=a.ui.intersect(b,this,this.options.tolerance),e=!d&&this.isover==1?"isout":d&&this.isover==0?"isover":null;if(!e)return;var f;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");g.length&&(f=a.data(g[0],"droppable"),f.greedyChild=e=="isover"?1:0)}f&&e=="isover"&&(f.isover=0,f.isout=1,f._out.call(f,c)),this[e]=1,this[e=="isout"?"isover":"isout"]=0,this[e=="isover"?"_over":"_out"].call(this,c),f&&e=="isout"&&(f.isout=0,f.isover=1,f._over.call(f,c))})},dragStop:function(b,c){b.element.parents(":not(body,html)").unbind("scroll.droppable"),b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)}}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.resizable.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;return d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width)),a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(!a.browser.msie||!a(c).is(":hidden")&&!a(c).parents(":hidden").length)e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0});else continue}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.22"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.selectable.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("<div class='ui-selectable-helper'></div>")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.right<e||i.top>h||i.bottom<f):d.tolerance=="fit"&&(j=i.left>e&&i.right<g&&i.top>f&&i.bottom<h),j?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,c._trigger("selecting",b,{selecting:i.element}))):(i.selecting&&((b.metaKey||b.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),c._trigger("unselecting",b,{unselecting:i.element}))),i.selected&&!b.metaKey&&!b.ctrlKey&&!i.startselected&&(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,c._trigger("unselecting",b,{unselecting:i.element})))}),!1},_mouseStop:function(b){var c=this;this.dragged=!1;var d=this.options;return a(".ui-unselecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-unselecting"),d.unselecting=!1,d.startselected=!1,c._trigger("unselected",b,{unselected:d.element})}),a(".ui-selecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected"),d.selecting=!1,d.selected=!0,d.startselected=!0,c._trigger("selected",b,{selected:d.element})}),this._trigger("stop",b),this.helper.remove(),!1}}),a.extend(a.ui.selectable,{version:"1.8.22"})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.sortable.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY<c.scrollSensitivity?this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop+c.scrollSpeed:b.pageY-this.overflowOffset.top<c.scrollSensitivity&&(this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop-c.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-b.pageX<c.scrollSensitivity?this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft+c.scrollSpeed:b.pageX-this.overflowOffset.left<c.scrollSensitivity&&(this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft-c.scrollSpeed)):(b.pageY-a(document).scrollTop()<c.scrollSensitivity?d=a(document).scrollTop(a(document).scrollTop()-c.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<c.scrollSensitivity&&(d=a(document).scrollTop(a(document).scrollTop()+c.scrollSpeed)),b.pageX-a(document).scrollLeft()<c.scrollSensitivity?d=a(document).scrollLeft(a(document).scrollLeft()-c.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<c.scrollSensitivity&&(d=a(document).scrollLeft(a(document).scrollLeft()+c.scrollSpeed))),d!==!1&&a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(var e=this.items.length-1;e>=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+j<i&&b+k>f&&b+k<g;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?l:f<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<g&&h<d+this.helperProportions.height/2&&e-this.helperProportions.height/2<i},_intersectsWithPointer:function(b){var c=this.options.axis==="x"||a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top,b.height),d=this.options.axis==="y"||a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left,b.width),e=c&&d,f=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();return e?this.floating?g&&g=="right"||f=="down"?2:1:f&&(f=="down"?2:1):!1},_intersectsWithSides:function(b){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top+b.height/2,b.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left+b.width/2,b.width),e=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:e&&(e=="down"&&c||e=="up"&&!c)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(b){this.items=[],this.containers=[this];var c=this.items,d=this,e=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]],f=this._connectWith();if(f&&this.ready)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i<m;i++){var n=a(l[i]);n.data(this.widgetName+"-item",k),c.push({item:n,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var c=this.items.length-1;c>=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)<f&&(f=Math.abs(j-h),g=this.items[i],this.direction=j-h>0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.left<this.containment[0]&&(f=this.containment[0]+this.offset.click.left),b.pageY-this.offset.click.top<this.containment[1]&&(g=this.containment[1]+this.offset.click.top),b.pageX-this.offset.click.left>this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.top<this.containment[1]||h-this.offset.click.top>this.containment[3]?h-this.offset.click.top<this.containment[1]?h+c.grid[1]:h-c.grid[1]:h:h;var i=this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0];f=this.containment?i-this.offset.click.left<this.containment[0]||i-this.offset.click.left>this.containment[2]?i-this.offset.click.left<this.containment[0]?i+c.grid[0]:i-c.grid[0]:i:i}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_rearrange:function(a,b,c,d){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var e=this,f=this.counter;window.setTimeout(function(){f==e.counter&&e.refreshPositions(!d)},0)},_clear:function(b,c){this.reverting=!1;var d=[],e=this;!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!c&&d.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!c&&d.push(function(a){this._trigger("update",a,this._uiHash())});if(!a.ui.contains(this.element[0],this.currentItem[0])){c||d.push(function(a){this._trigger("remove",a,this._uiHash())});for(var f=this.containers.length-1;f>=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}return this.fromOutside=!1,!1}c||this._trigger("beforeStop",b,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null;if(!c){for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){a.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(b){var c=b||this;return{helper:c.helper,placeholder:c.placeholder||a([]),position:c.position,originalPosition:c.originalPosition,offset:c.positionAbs,item:c.currentItem,sender:b?b.element:null}}}),a.extend(a.ui.sortable,{version:"1.8.22"})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.accordion.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:!0,clearStyle:!1,collapsible:!1,event:"click",fillSpace:!1,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("<span></span>").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}return f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabled)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.22",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.autocomplete.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("<ul></ul>").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)===!1)return;return this._search(a)},_search:function(a){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.source({term:a},this._response())},_response:function(){var a=this,b=++c;return function(d){b===c&&a.__response(d),a.pending--,a.pending||a.element.removeClass("ui-autocomplete-loading")}},__response:function(a){!this.options.disabled&&a&&a.length?(a=this._normalize(a),this._suggest(a),this._trigger("open")):this.close()},close:function(a){clearTimeout(this.closing),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.deactivate(),this._trigger("close",a))},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(b){return b.length&&b[0].label&&b[0].value?b:a.map(b,function(b){return typeof b=="string"?{label:b,value:b}:a.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(b){var c=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(c,b),this.menu.deactivate(),this.menu.refresh(),c.show(),this._resizeMenu(),c.position(a.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(new a.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(b,c){var d=this;a.each(c,function(a,c){d._renderItem(b,c)})},_renderItem:function(b,c){return a("<li></li>").data("item.autocomplete",c).append(a("<a></a>").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[a.fn.prop?"prop":"attr"]("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})}(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.button.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){var c,d,e,f,g="ui-button ui-widget ui-state-default ui-corner-all",h="ui-state-hover ui-state-active ",i="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",j=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},k=function(b){var c=b.name,d=b.form,e=a([]);return c&&(d?e=a(d).find("[name='"+c+"']"):e=a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form})),e};a.widget("ui.button",{options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",j),typeof this.options.disabled!="boolean"?this.options.disabled=!!this.element.propAttr("disabled"):this.element.propAttr("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var b=this,h=this.options,i=this.type==="checkbox"||this.type==="radio",l="ui-state-hover"+(i?"":" ui-state-active"),m="ui-state-focus";h.label===null&&(h.label=this.buttonElement.html()),this.buttonElement.addClass(g).attr("role","button").bind("mouseenter.button",function(){if(h.disabled)return;a(this).addClass("ui-state-hover"),this===c&&a(this).addClass("ui-state-active")}).bind("mouseleave.button",function(){if(h.disabled)return;a(this).removeClass(l)}).bind("click.button",function(a){h.disabled&&(a.preventDefault(),a.stopImmediatePropagation())}),this.element.bind("focus.button",function(){b.buttonElement.addClass(m)}).bind("blur.button",function(){b.buttonElement.removeClass(m)}),i&&(this.element.bind("change.button",function(){if(f)return;b.refresh()}),this.buttonElement.bind("mousedown.button",function(a){if(h.disabled)return;f=!1,d=a.pageX,e=a.pageY}).bind("mouseup.button",function(a){if(h.disabled)return;if(d!==a.pageX||e!==a.pageY)f=!0})),this.type==="checkbox"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).toggleClass("ui-state-active"),b.buttonElement.attr("aria-pressed",b.element[0].checked)}):this.type==="radio"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).addClass("ui-state-active"),b.buttonElement.attr("aria-pressed","true");var c=b.element[0];k(c).not(c).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown.button",function(){if(h.disabled)return!1;a(this).addClass("ui-state-active"),c=this,a(document).one("mouseup",function(){c=null})}).bind("mouseup.button",function(){if(h.disabled)return!1;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(b){if(h.disabled)return!1;(b.keyCode==a.ui.keyCode.SPACE||b.keyCode==a.ui.keyCode.ENTER)&&a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(b){b.keyCode===a.ui.keyCode.SPACE&&a(this).click()})),this._setOption("disabled",h.disabled),this._resetButton()},_determineButtonType:function(){this.element.is(":checkbox")?this.type="checkbox":this.element.is(":radio")?this.type="radio":this.element.is("input")?this.type="input":this.type="button";if(this.type==="checkbox"||this.type==="radio"){var a=this.element.parents().filter(":last"),b="label[for='"+this.element.attr("id")+"']";this.buttonElement=a.find(b),this.buttonElement.length||(a=a.length?a.siblings():this.element.siblings(),this.buttonElement=a.filter(b),this.buttonElement.length||(this.buttonElement=a.find(b))),this.element.addClass("ui-helper-hidden-accessible");var c=this.element.is(":checked");c&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.attr("aria-pressed",c)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(g+" "+h+" "+i).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title"),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled"){c?this.element.propAttr("disabled",!0):this.element.propAttr("disabled",!1);return}this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b),this.type==="radio"?k(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):this.type==="checkbox"&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if(this.type==="input"){this.options.label&&this.element.val(this.options.label);return}var b=this.buttonElement.removeClass(i),c=a("<span></span>",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>"),d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>"),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.dialog.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("<div></div>")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("<span></span>")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("<span></span>").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('<button type="button"></button>').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){if(a==="click")return;a in f?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.22",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()<a.ui.dialog.overlay.maxZ)return!1})},1),a(document).bind("keydown.dialog-overlay",function(c){b.options.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}),a(window).bind("resize.dialog-overlay",a.ui.dialog.overlay.resize));var c=(this.oldInstances.pop()||a("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b<c?a(window).height()+"px":b+"px"):a(document).height()+"px"},width:function(){var b,c;return a.browser.msie?(b=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth),c=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth),b<c?a(window).width()+"px":b+"px"):a(document).width()+"px"},resize:function(){var b=a([]);a.each(a.ui.dialog.overlay.instances,function(){b=b.add(this)}),b.css({width:0,height:0}).css({width:a.ui.dialog.overlay.width(),height:a.ui.dialog.overlay.height()})}}),a.extend(a.ui.dialog.overlay.prototype,{destroy:function(){a.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.slider.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;i<g;i+=1)h.push(f);this.handles=e.add(a(h.join("")).appendTo(b.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(a){a.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){d.disabled?a(this).blur():(a(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),a(this).addClass("ui-state-focus"))}).blur(function(){a(this).removeClass("ui-state-focus")}),this.handles.each(function(b){a(this).data("index.ui-slider-handle",b)}),this.handles.keydown(function(d){var e=a(this).data("index.ui-slider-handle"),f,g,h,i;if(b.options.disabled)return;switch(d.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:d.preventDefault();if(!b._keySliding){b._keySliding=!0,a(this).addClass("ui-state-active"),f=b._start(d,e);if(f===!1)return}}i=b.options.step,b.options.values&&b.options.values.length?g=h=b.values(e):g=h=b.value();switch(d.keyCode){case a.ui.keyCode.HOME:h=b._valueMin();break;case a.ui.keyCode.END:h=b._valueMax();break;case a.ui.keyCode.PAGE_UP:h=b._trimAlignValue(g+(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(g-(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(g===b._valueMax())return;h=b._trimAlignValue(g+i);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(g===b._valueMin())return;h=b._trimAlignValue(g-i)}b._slide(d,e,h)}).keyup(function(c){var d=a(this).data("index.ui-slider-handle");b._keySliding&&(b._keySliding=!1,b._stop(c,d),b._change(c,d),a(this).removeClass("ui-state-active"))}),this._refreshValue(),this._animateOff=!1},destroy:function(){return this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options,d,e,f,g,h,i,j,k,l;return c.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),d={x:b.pageX,y:b.pageY},e=this._normValueFromMouse(d),f=this._valueMax()-this._valueMin()+1,h=this,this.handles.each(function(b){var c=Math.abs(e-h.values(b));f>c&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c<d)&&(c=d),c!==this.values(b)&&(e=this.values(),e[b]=c,f=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e}),d=this.values(b?0:1),f!==!1&&this.values(b,c,!0))):c!==this.value()&&(f=this._trigger("slide",a,{handle:this.handles[b],value:c}),f!==!1&&this.value(c))},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=this._trimAlignValue(a),this._refreshValue(),this._change(null,0);return}return this._value()},values:function(b,c){var d,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f<d.length;f+=1)d[f]=this._trimAlignValue(e[f]),this._change(null,f);this._refreshValue()},_setOption:function(b,c){var d,e=0;a.isArray(this.options.values)&&(e=this.options.values.length),a.Widget.prototype._setOption.apply(this,arguments);switch(b){case"disabled":c?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.propAttr("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.propAttr("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(d=0;d<e;d+=1)this._change(null,d);this._animateOff=!1}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a),a},_values:function(a){var b,c,d;if(arguments.length)return b=this.options.values[a],b=this._trimAlignValue(b),b;c=this.options.values.slice();for(d=0;d<c.length;d+=1)c[d]=this._trimAlignValue(c[d]);return c},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.22"})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.tabs.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading…</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)return e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1<this.anchors.length?1:-1)),c.disabled=a.map(a.grep(c.disabled,function(a,c){return a!=b}),function(a,c){return a>=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.22"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a<c.anchors.length?a:0)},a),b&&b.stopPropagation()}),f=c._unrotate||(c._unrotate=b?function(a){e()}:function(a){a.clientX&&c.rotate(null)});return a?(this.element.bind("tabsshow",e),this.anchors.bind(d.event+".tabs",f),e()):(clearTimeout(c.rotation),this.element.unbind("tabsshow",e),this.anchors.unbind(d.event+".tabs",f),delete this._rotate,delete this._unrotate),this}})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.datepicker.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function($,undefined){function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.22"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$('<span class="'+this._appendClass+'">'+c+"</span>"),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('<button type="button"></button>').addClass(this._triggerClass).html(g==""?f:$("<img/>").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;d<a.length;d++)a[d].length>b&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$('<input type="text" id="'+g+'" style="position: absolute; top: -100px; width: 0px;"/>'),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return!0;return!1},_getInst:function(a){try{return $.data(a,PROP_NAME)}catch(b){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(a,b,c){var d=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?$.extend({},$.datepicker._defaults):d?b=="all"?$.extend({},d.settings):this._get(d,b):null;var e=b||{};typeof b=="string"&&(e={},e[b]=c);if(d){this._curInst==d&&this._hideDatepicker();var f=this._getDateDatepicker(a,!0),g=this._getMinMaxDate(d,"min"),h=this._getMinMaxDate(d,"max");extendRemove(d.settings,e),g!==null&&e.dateFormat!==undefined&&e.minDate===undefined&&(d.settings.minDate=this._formatDate(d,g)),h!==null&&e.dateFormat!==undefined&&e.maxDate===undefined&&(d.settings.maxDate=this._formatDate(d,h)),this._attachments($(a),d),this._autoSize(d),this._setDate(d,f),this._updateAlternate(d),this._updateDatepicker(d)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){var b=this._getInst(a);b&&this._updateDatepicker(b)},_setDateDatepicker:function(a,b){var c=this._getInst(a);c&&(this._setDate(c,b),this._updateDatepicker(c),this._updateAlternate(c))},_getDateDatepicker:function(a,b){var c=this._getInst(a);return c&&!c.inline&&this._setDateFromField(c,b),c?this._getDate(c):null},_doKeyDown:function(a){var b=$.datepicker._getInst(a.target),c=!0,d=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=!0;if($.datepicker._datepickerShowing)switch(a.keyCode){case 9:$.datepicker._hideDatepicker(),c=!1;break;case 13:var e=$("td."+$.datepicker._dayOverClass+":not(."+$.datepicker._currentClass+")",b.dpDiv);e[0]&&$.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,e[0]);var f=$.datepicker._get(b,"onSelect");if(f){var g=$.datepicker._formatDate(b);f.apply(b.input?b.input[0]:null,[g,b])}else $.datepicker._hideDatepicker();return!1;case 27:$.datepicker._hideDatepicker();break;case 33:$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 34:$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 35:(a.ctrlKey||a.metaKey)&&$.datepicker._clearDate(a.target),c=a.ctrlKey||a.metaKey;break;case 36:(a.ctrlKey||a.metaKey)&&$.datepicker._gotoToday(a.target),c=a.ctrlKey||a.metaKey;break;case 37:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?1:-1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 38:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,-7,"D"),c=a.ctrlKey||a.metaKey;break;case 39:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?-1:1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 40:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,7,"D"),c=a.ctrlKey||a.metaKey;break;default:c=!1}else a.keyCode==36&&a.ctrlKey?$.datepicker._showDatepicker(this):c=!1;c&&(a.preventDefault(),a.stopPropagation())},_doKeyPress:function(a){var b=$.datepicker._getInst(a.target);if($.datepicker._get(b,"constrainInput")){var c=$.datepicker._possibleChars($.datepicker._get(b,"dateFormat")),d=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||d<" "||!c||c.indexOf(d)>-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a)),this._attachHandlers(a);var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+(c?0:$(document).scrollLeft()),i=document.documentElement.clientHeight+(c?0:$(document).scrollTop());return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1<a.length&&a.charAt(s+1)==b;return c&&s++,c},o=function(a){var c=n(a),d=a=="@"?14:a=="!"?20:a=="y"&&c?4:a=="o"?3:2,e=new RegExp("^\\d{1,"+d+"}"),f=b.substring(r).match(e);if(!f)throw"Missing number at position "+r;return r+=f[0].length,parseInt(f[0],10)},p=function(a,c,d){var e=$.map(n(a)?d:c,function(a,b){return[[b,a]]}).sort(function(a,b){return-(a[1].length-b[1].length)}),f=-1;$.each(e,function(a,c){var d=c[1];if(b.substr(r,d.length).toLowerCase()==d.toLowerCase())return f=c[0],r+=d.length,!1});if(f!=-1)return f+1;throw"Unknown name at position "+r},q=function(){if(b.charAt(r)!=a.charAt(s))throw"Unexpected literal at position "+r;r++},r=0;for(var s=0;s<a.length;s++)if(m)a.charAt(s)=="'"&&!n("'")?m=!1:q();else switch(a.charAt(s)){case"d":k=o("d");break;case"D":p("D",e,f);break;case"o":l=o("o");break;case"m":j=o("m");break;case"M":j=p("M",g,h);break;case"y":i=o("y");break;case"@":var t=new Date(o("@"));i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"!":var t=new Date((o("!")-this._ticksTo1970)/1e4);i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"'":n("'")?q():m=!0;break;default:q()}if(r<b.length)throw"Extra/unparsed characters found in date: "+b.substring(r);i==-1?i=(new Date).getFullYear():i<100&&(i+=(new Date).getFullYear()-(new Date).getFullYear()%100+(i<=d?0:-100));if(l>-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+1<a.length&&a.charAt(m+1)==b;return c&&m++,c},i=function(a,b,c){var d=""+b;if(h(a))while(d.length<c)d="0"+d;return d},j=function(a,b,c,d){return h(a)?d[b]:c[b]},k="",l=!1;if(b)for(var m=0;m<a.length;m++)if(l)a.charAt(m)=="'"&&!h("'")?l=!1:k+=a.charAt(m);else switch(a.charAt(m)){case"d":k+=i("d",b.getDate(),2);break;case"D":k+=j("D",b.getDay(),d,e);break;case"o":k+=i("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864e5),3);break;case"m":k+=i("m",b.getMonth()+1,2);break;case"M":k+=j("M",b.getMonth(),f,g);break;case"y":k+=h("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case"@":k+=b.getTime();break;case"!":k+=b.getTime()*1e4+this._ticksTo1970;break;case"'":h("'")?k+="'":l=!0;break;default:k+=a.charAt(m)}return k},_possibleChars:function(a){var b="",c=!1,d=function(b){var c=e+1<a.length&&a.charAt(e+1)==b;return c&&e++,c};for(var e=0;e<a.length;e++)if(c)a.charAt(e)=="'"&&!d("'")?c=!1:b+=a.charAt(e);else switch(a.charAt(e)){case"d":case"m":case"y":case"@":b+="0123456789";break;case"D":case"M":return null;case"'":d("'")?b+="'":c=!0;break;default:b+=a.charAt(e)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()==a.lastVal)return;var c=this._get(a,"dateFormat"),d=a.lastVal=a.input?a.input.val():null,e,f;e=f=this._getDefaultDate(a);var g=this._getFormatConfig(a);try{e=this.parseDate(c,d,g)||f}catch(h){this.log(h),d=b?"":d}a.selectedDay=e.getDate(),a.drawMonth=a.selectedMonth=e.getMonth(),a.drawYear=a.selectedYear=e.getFullYear(),a.currentDay=d?e.getDate():0,a.currentMonth=d?e.getMonth():0,a.currentYear=d?e.getFullYear():0,this._adjustInstDate(a)},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var d=function(a){var b=new Date;return b.setDate(b.getDate()+a),b},e=function(b){try{return $.datepicker.parseDate($.datepicker._get(a,"dateFormat"),b,$.datepicker._getFormatConfig(a))}catch(c){}var d=(b.toLowerCase().match(/^c/)?$.datepicker._getDate(a):null)||new Date,e=d.getFullYear(),f=d.getMonth(),g=d.getDate(),h=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,i=h.exec(b);while(i){switch(i[2]||"d"){case"d":case"D":g+=parseInt(i[1],10);break;case"w":case"W":g+=parseInt(i[1],10)*7;break;case"m":case"M":f+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f));break;case"y":case"Y":e+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f))}i=h.exec(b)}return new Date(e,f,g)},f=b==null||b===""?c:typeof b=="string"?e(b):typeof b=="number"?isNaN(b)?c:d(b):new Date(b.getTime());return f=f&&f.toString()=="Invalid Date"?c:f,f&&(f.setHours(0),f.setMinutes(0),f.setSeconds(0),f.setMilliseconds(0)),this._daylightSavingAdjust(f)},_daylightSavingAdjust:function(a){return a?(a.setHours(a.getHours()>12?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_attachHandlers:function(a){var b=this._get(a,"stepMonths"),c="#"+a.id;a.dpDiv.find("[data-handler]").map(function(){var a={prev:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,-b,"M")},next:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,+b,"M")},hide:function(){window["DP_jQuery_"+dpuuid].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+dpuuid].datepicker._gotoToday(c)},selectDay:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectDay(c,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"M"),!1},selectYear:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"Y"),!1}};$(this).bind(this.getAttribute("data-event"),a[this.getAttribute("data-handler")])})},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&p<l?l:p;while(this._daylightSavingAdjust(new Date(o,n,1))>p)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?'<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click" title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>":e?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?'<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":e?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">'+this._get(a,"closeText")+"</button>",x=d?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?w:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click">'+u+"</button>":"")+(c?"":w)+"</div>":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L<g[0];L++){var M="";this.maxRows=4;for(var N=0;N<g[1];N++){var O=this._daylightSavingAdjust(new Date(o,n,a.selectedDay)),P=" ui-corner-all",Q="";if(j){Q+='<div class="ui-datepicker-group';if(g[1]>1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+P+'">'+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'</div><table class="ui-datepicker-calendar"><thead>'+"<tr>";var R=z?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="<th"+((S+y+6)%7>=5?' class="ui-datepicker-week-end"':"")+">"+'<span title="'+A[T]+'">'+C[T]+"</span></th>"}Q+=R+"</tr></thead><tbody>";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z<X;Z++){Q+="<tr>";var _=z?'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(Y)+"</td>":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Y<l||m&&Y>m;_+='<td class="'+((S+y+6)%7>=5?" ui-datepicker-week-end":"")+(bb?" ui-datepicker-other-month":"")+(Y.getTime()==O.getTime()&&n==a.selectedMonth&&a._keyEvent||J.getTime()==Y.getTime()&&J.getTime()==O.getTime()?" "+this._dayOverClass:"")+(bc?" "+this._unselectableClass+" ui-state-disabled":"")+(bb&&!G?"":" "+ba[1]+(Y.getTime()==k.getTime()?" "+this._currentClass:"")+(Y.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!bb||G)&&ba[2]?' title="'+ba[2]+'"':"")+(bc?"":' data-handler="selectDay" data-event="click" data-month="'+Y.getMonth()+'" data-year="'+Y.getFullYear()+'"')+">"+(bb&&!G?" ":bc?'<span class="ui-state-default">'+Y.getDate()+"</span>":'<a class="ui-state-default'+(Y.getTime()==b.getTime()?" ui-state-highlight":"")+(Y.getTime()==k.getTime()?" ui-state-active":"")+(bb?" ui-priority-secondary":"")+'" href="#">'+Y.getDate()+"</a>")+"</td>",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+"</tr>"}n++,n>11&&(n=0,o++),Q+="</tbody></table>"+(j?"</div>"+(g[0]>0&&N==g[1]-1?'<div class="ui-datepicker-row-break"></div>':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='<div class="ui-datepicker-title">',m="";if(f||!i)m+='<span class="ui-datepicker-month">'+g[b]+"</span>";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';for(var p=0;p<12;p++)(!n||p>=d.getMonth())&&(!o||p<=e.getMonth())&&(m+='<option value="'+p+'"'+(p==b?' selected="selected"':"")+">"+h[p]+"</option>");m+="</select>"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+='<span class="ui-datepicker-year">'+c+"</span>";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';for(;t<=u;t++)a.yearshtml+='<option value="'+t+'"'+(t==c?' selected="selected"':"")+">"+t+"</option>";a.yearshtml+="</select>",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="</div>",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&b<c?c:b;return e=d&&e>d?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.22",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.ui.progressbar.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.22"})})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.core.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=(a.curCSS||a.css)(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.22",save:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.data("ec.storage."+b[c],a[0].style[b[c]])},restore:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.css(b[c],a.data("ec.storage."+b[c]))},setMode:function(a,b){return b=="toggle"&&(b=a.is(":hidden")?"show":"hide"),b},getBaseline:function(a,b){var c,d;switch(a[0]){case"top":c=0;break;case"middle":c=.5;break;case"bottom":c=1;break;default:c=a[0]/b.height}switch(a[1]){case"left":d=0;break;case"center":d=.5;break;case"right":d=1;break;default:d=a[1]/b.width}return{x:d,y:c}},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper"))return b.parent();var c={width:b.outerWidth(!0),height:b.outerHeight(!0),"float":b.css("float")},d=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return b==0?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g))+c},easeOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*b)*Math.sin((b*e-f)*2*Math.PI/g)+d+c},easeInOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e/2)==2)return c+d;g||(g=e*.3*1.5);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return b<1?-0.5*h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)+c:h*Math.pow(2,-10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)*.5+d+c},easeInBack:function(a,c,d,e,f,g){return g==b&&(g=1.70158),e*(c/=f)*c*((g+1)*c-g)+d},easeOutBack:function(a,c,d,e,f,g){return g==b&&(g=1.70158),e*((c=c/f-1)*c*((g+1)*c+g)+1)+d},easeInOutBack:function(a,c,d,e,f,g){return g==b&&(g=1.70158),(c/=f/2)<1?e/2*c*c*(((g*=1.525)+1)*c-g)+d:e/2*((c-=2)*c*(((g*=1.525)+1)*c+g)+2)+d},easeInBounce:function(b,c,d,e,f){return e-a.easing.easeOutBounce(b,f-c,0,e,f)+d},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?d*7.5625*b*b+c:b<2/2.75?d*(7.5625*(b-=1.5/2.75)*b+.75)+c:b<2.5/2.75?d*(7.5625*(b-=2.25/2.75)*b+.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+.984375)+c},easeInOutBounce:function(b,c,d,e,f){return c<f/2?a.easing.easeInBounce(b,c*2,0,e,f)*.5+d:a.easing.easeOutBounce(b,c*2-f,0,e,f)*.5+e*.5+d}})}(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.blind.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.bounce.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight(!0)/3:c.outerWidth(!0)/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m<h;m++){var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing),g=e=="hide"?g*2:g/2}if(e=="hide"){var l={opacity:0};l[j]=(k=="pos"?"-=":"+=")+g,c.animate(l,i/2,b.options.easing,function(){c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}else{var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.clip.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.clip=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","height","width"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=c[0].tagName=="IMG"?g:c,i={size:f=="vertical"?"height":"width",position:f=="vertical"?"top":"left"},j=f=="vertical"?h.height():h.width();e=="show"&&(h.css(i.size,0),h.css(i.position,j/2));var k={};k[i.size]=e=="show"?j:0,k[i.position]=e=="show"?0:j/2,h.animate(k,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.drop.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.drop=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","opacity"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight(!0)/2:c.outerWidth(!0)/2);e=="show"&&c.css("opacity",0).css(g,h=="pos"?-i:i);var j={opacity:e=="show"?1:0};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.explode.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.explode=function(b){return this.queue(function(){var c=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3,d=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?a(this).is(":visible")?"hide":"show":b.options.mode;var e=a(this).show().css("visibility","hidden"),f=e.offset();f.top-=parseInt(e.css("marginTop"),10)||0,f.left-=parseInt(e.css("marginLeft"),10)||0;var g=e.outerWidth(!0),h=e.outerHeight(!0);for(var i=0;i<c;i++)for(var j=0;j<d;j++)e.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.fade.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.fold.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.highlight.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.pulsate.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i<e;i++)c.animate({opacity:h},f,b.options.easing),h=(h+1)%2;c.animate({opacity:h},f,b.options.easing,function(){h==0&&c.hide(),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}).dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.scale.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.puff=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide"),e=parseInt(b.options.percent,10)||150,f=e/100,g={height:c.height(),width:c.width()};a.extend(b.options,{fade:!0,mode:d,percent:d=="hide"?e:100,from:d=="hide"?g:{height:g.height*f,width:g.width*f}}),c.effect("scale",b.options,b.duration,b.callback),c.dequeue()})},a.effects.scale=function(b){return this.queue(function(){var c=a(this),d=a.extend(!0,{},b.options),e=a.effects.setMode(c,b.options.mode||"effect"),f=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:e=="hide"?0:100),g=b.options.direction||"both",h=b.options.origin;e!="effect"&&(d.origin=h||["middle","center"],d.restore=!0);var i={height:c.height(),width:c.width()};c.from=b.options.from||(e=="show"?{height:0,width:0}:i);var j={y:g!="horizontal"?f/100:1,x:g!="vertical"?f/100:1};c.to={height:i.height*j.y,width:i.width*j.x},b.options.fade&&(e=="show"&&(c.from.opacity=0,c.to.opacity=1),e=="hide"&&(c.from.opacity=1,c.to.opacity=0)),d.from=c.from,d.to=c.to,d.mode=e,c.effect("size",d,b.duration,b.callback),c.dequeue()})},a.effects.size=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","width","height","overflow","opacity"],e=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],g=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],j=a.effects.setMode(c,b.options.mode||"effect"),k=b.options.restore||!1,l=b.options.scale||"both",m=b.options.origin,n={height:c.height(),width:c.width()};c.from=b.options.from||n,c.to=b.options.to||n;if(m){var p=a.effects.getBaseline(m,n);c.from.top=(n.height-c.from.height)*p.y,c.from.left=(n.width-c.from.width)*p.x,c.to.top=(n.height-c.to.height)*p.y,c.to.left=(n.width-c.to.width)*p.x}var q={from:{y:c.from.height/n.height,x:c.from.width/n.width},to:{y:c.to.height/n.height,x:c.to.width/n.width}};if(l=="box"||l=="both")q.from.y!=q.to.y&&(d=d.concat(h),c.from=a.effects.setTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(d=d.concat(i),c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to));(l=="content"||l=="both")&&q.from.y!=q.to.y&&(d=d.concat(g),c.from=a.effects.setTransition(c,g,q.from.y,c.from),c.to=a.effects.setTransition(c,g,q.to.y,c.to)),a.effects.save(c,k?d:e),c.show(),a.effects.createWrapper(c),c.css("overflow","hidden").css(c.from);if(l=="content"||l=="both")h=h.concat(["marginTop","marginBottom"]).concat(g),i=i.concat(["marginLeft","marginRight"]),f=d.concat(h).concat(i),c.find("*[width]").each(function(){var c=a(this);k&&a.effects.save(c,f);var d={height:c.height(),width:c.width()};c.from={height:d.height*q.from.y,width:d.width*q.from.x},c.to={height:d.height*q.to.y,width:d.width*q.to.x},q.from.y!=q.to.y&&(c.from=a.effects.setTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to)),c.css(c.from),c.animate(c.to,b.duration,b.options.easing,function(){k&&a.effects.restore(c,f)})});c.animate(c.to,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){c.to.opacity===0&&c.css("opacity",c.from.opacity),j=="hide"&&c.hide(),a.effects.restore(c,k?d:e),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.shake.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.shake=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"left",g=b.options.distance||20,h=b.options.times||3,i=b.duration||b.options.duration||140;a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",l={},m={},n={};l[j]=(k=="pos"?"-=":"+=")+g,m[j]=(k=="pos"?"+=":"-=")+g*2,n[j]=(k=="pos"?"-=":"+=")+g*2,c.animate(l,i,b.options.easing);for(var p=1;p<h;p++)c.animate(m,i,b.options.easing).animate(n,i,b.options.easing);c.animate(m,i,b.options.easing).animate(l,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.slide.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.slide=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"show"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c).css({overflow:"hidden"});var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight(!0):c.outerWidth(!0));e=="show"&&c.css(g,h=="pos"?isNaN(i)?"-"+i:-i:i);var j={};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.22 - 2012-07-24 * https://github.com/jquery/jquery-ui * Includes: jquery.effects.transfer.js * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ (function(a,b){a.effects.transfer=function(b){return this.queue(function(){var c=a(this),d=a(b.options.to),e=d.offset(),f={top:e.top,left:e.left,height:d.innerHeight(),width:d.innerWidth()},g=c.offset(),h=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/jquery.alerts.js�����������������������������������������������0000664�0000000�0000000�00000016252�12122555434�0022665�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// jQuery Alert Dialogs Plugin // // Version 1.1 // // Cory S.N. LaViska // A Beautiful Site (http://abeautifulsite.net/) // 14 May 2009 // // Visit http://abeautifulsite.net/notebook/87 for more information // // Usage: // jAlert( message, [title, callback] ) // jConfirm( message, [title, callback] ) // jPrompt( message, [value, title, callback] ) // // History: // // 1.00 - Released (29 December 2008) // // 1.01 - Fixed bug where unbinding would destroy all resize events // // License: // // This plugin is dual-licensed under the GNU General Public License and the MIT License and // is copyright 2008 A Beautiful Site, LLC. // (function($) { $.alerts = { // These properties can be read/written by accessing $.alerts.propertyName from your scripts at any time verticalOffset: -75, // vertical offset of the dialog from center screen, in pixels horizontalOffset: 0, // horizontal offset of the dialog from center screen, in pixels/ repositionOnResize: true, // re-centers the dialog on window resize overlayOpacity: .01, // transparency level of overlay overlayColor: '#FFF', // base color of overlay draggable: true, // make the dialogs draggable (requires UI Draggables plugin) okButton: ' OK ', // text for the OK button cancelButton: ' Cancel ', // text for the Cancel button dialogClass: null, // if specified, this class will be applied to all dialogs // Public methods alert: function(message, title, callback) { if( title == null ) title = 'Alert'; $.alerts._show(title, message, null, 'alert', function(result) { if( callback ) callback(result); }); }, confirm: function(message, title, callback) { if( title == null ) title = 'Confirm'; $.alerts._show(title, message, null, 'confirm', function(result) { if( callback ) callback(result); }); }, prompt: function(message, value, title, callback) { if( title == null ) title = 'Prompt'; $.alerts._show(title, message, value, 'prompt', function(result) { if( callback ) callback(result); }); }, // Private methods _show: function(title, msg, value, type, callback) { $.alerts._hide(); $.alerts._overlay('show'); $("BODY").append( '<div id="popup_container">' + '<h1 id="popup_title"></h1>' + '<div id="popup_content">' + '<div id="popup_message"></div>' + '</div>' + '</div>'); if( $.alerts.dialogClass ) $("#popup_container").addClass($.alerts.dialogClass); // IE6 Fix var pos = ($.browser.msie && parseInt($.browser.version) <= 6 ) ? 'absolute' : 'fixed'; $("#popup_container").css({ position: pos, zIndex: 99999, padding: 0, margin: 0 }); $("#popup_title").text(title); $("#popup_content").addClass(type); $("#popup_message").text(msg); $("#popup_message").html( $("#popup_message").text().replace(/\n/g, '<br />') ); $("#popup_container").css({ minWidth: $("#popup_container").outerWidth(), maxWidth: $("#popup_container").outerWidth() }); $.alerts._reposition(); $.alerts._maintainPosition(true); switch( type ) { case 'alert': $("#popup_message").after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /></div>'); $("#popup_ok").click( function() { $.alerts._hide(); callback(true); }); $("#popup_ok").focus().keypress( function(e) { if( e.keyCode == 13 || e.keyCode == 27 ) $("#popup_ok").trigger('click'); }); break; case 'confirm': $("#popup_message").after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + $.alerts.cancelButton + '" id="popup_cancel" /></div>'); $("#popup_ok").click( function() { $.alerts._hide(); if( callback ) callback(true); }); $("#popup_cancel").click( function() { $.alerts._hide(); if( callback ) callback(false); }); $("#popup_ok").focus(); $("#popup_ok, #popup_cancel").keypress( function(e) { if( e.keyCode == 13 ) $("#popup_ok").trigger('click'); if( e.keyCode == 27 ) $("#popup_cancel").trigger('click'); }); break; case 'prompt': $("#popup_message").append('<br /><input type="text" size="30" id="popup_prompt" />').after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + $.alerts.cancelButton + '" id="popup_cancel" /></div>'); $("#popup_prompt").width( $("#popup_message").width() ); $("#popup_ok").click( function() { var val = $("#popup_prompt").val(); $.alerts._hide(); if( callback ) callback( val ); }); $("#popup_cancel").click( function() { $.alerts._hide(); if( callback ) callback( null ); }); $("#popup_prompt, #popup_ok, #popup_cancel").keypress( function(e) { if( e.keyCode == 13 ) $("#popup_ok").trigger('click'); if( e.keyCode == 27 ) $("#popup_cancel").trigger('click'); }); if( value ) $("#popup_prompt").val(value); $("#popup_prompt").focus().select(); break; } // Make draggable if( $.alerts.draggable ) { try { $("#popup_container").draggable({ handle: $("#popup_title") }); $("#popup_title").css({ cursor: 'move' }); } catch(e) { /* requires jQuery UI draggables */ } } }, _hide: function() { $("#popup_container").remove(); $.alerts._overlay('hide'); $.alerts._maintainPosition(false); }, _overlay: function(status) { switch( status ) { case 'show': $.alerts._overlay('hide'); $("BODY").append('<div id="popup_overlay"></div>'); $("#popup_overlay").css({ position: 'absolute', zIndex: 99998, top: '0px', left: '0px', width: '100%', height: $(document).height(), background: $.alerts.overlayColor, opacity: $.alerts.overlayOpacity }); break; case 'hide': $("#popup_overlay").remove(); break; } }, _reposition: function() { var top = (($(window).height() / 2) - ($("#popup_container").outerHeight() / 2)) + $.alerts.verticalOffset; var left = (($(window).width() / 2) - ($("#popup_container").outerWidth() / 2)) + $.alerts.horizontalOffset; if( top < 0 ) top = 0; if( left < 0 ) left = 0; // IE6 fix if( $.browser.msie && parseInt($.browser.version) <= 6 ) top = top + $(window).scrollTop(); $("#popup_container").css({ top: top + 'px', left: left + 'px' }); $("#popup_overlay").height( $(document).height() ); }, _maintainPosition: function(status) { if( $.alerts.repositionOnResize ) { switch(status) { case true: $(window).bind('resize', $.alerts._reposition); break; case false: $(window).unbind('resize', $.alerts._reposition); break; } } } } // Shortuct functions jAlert = function(message, title, callback) { $.alerts.alert(message, title, callback); } jConfirm = function(message, title, callback) { $.alerts.confirm(message, title, callback); }; jPrompt = function(message, value, title, callback) { $.alerts.prompt(message, value, title, callback); }; })(jQuery);������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/jquery.cookie.js�����������������������������������������������0000664�0000000�0000000�00000010226�12122555434�0022637�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * Cookie plugin * * Copyright (c) 2006 Klaus Hartl (stilbuero.de) * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ /** * Create a cookie with the given name and value and other optional parameters. * * @example $.cookie('the_cookie', 'the_value'); * @desc Set the value of a cookie. * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); * @desc Create a cookie with all available options. * @example $.cookie('the_cookie', 'the_value'); * @desc Create a session cookie. * @example $.cookie('the_cookie', null); * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain * used when the cookie was set. * * @param String name The name of the cookie. * @param String value The value of the cookie. * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. * If set to null or omitted, the cookie will be a session cookie and will not be retained * when the the browser exits. * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will * require a secure protocol (like HTTPS). * @type undefined * * @name $.cookie * @cat Plugins/Cookie * @author Klaus Hartl/klaus.hartl@stilbuero.de */ /** * Get the value of a cookie with the given name. * * @example $.cookie('the_cookie'); * @desc Get the value of a cookie. * * @param String name The name of the cookie. * @return The value of the cookie. * @type String * * @name $.cookie * @cat Plugins/Cookie * @author Klaus Hartl/klaus.hartl@stilbuero.de */ jQuery.cookie = function(name, value, options) { if (typeof value != 'undefined') { // name and value given, set cookie options = options || {}; if (value === null) { value = ''; options.expires = -1; } var expires = ''; if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { var date; if (typeof options.expires == 'number') { date = new Date(); date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); } else { date = options.expires; } expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE } // CAUTION: Needed to parenthesize options.path and options.domain // in the following expressions, otherwise they evaluate to undefined // in the packed version for some reason... var path = options.path ? '; path=' + (options.path) : ''; var domain = options.domain ? '; domain=' + (options.domain) : ''; var secure = options.secure ? '; secure' : ''; document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); } else { // only name given, get cookie var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } };��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/jquery.json-2.4.min.js�����������������������������������������0000664�0000000�0000000�00000004323�12122555434�0023423�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! jQuery JSON plugin 2.4.0 | code.google.com/p/jquery-json */ (function($){'use strict';var escape=/["\\\x00-\x1f\x7f-\x9f]/g,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},hasOwn=Object.prototype.hasOwnProperty;$.toJSON=typeof JSON==='object'&&JSON.stringify?JSON.stringify:function(o){if(o===null){return'null';} var pairs,k,name,val,type=$.type(o);if(type==='undefined'){return undefined;} if(type==='number'||type==='boolean'){return String(o);} if(type==='string'){return $.quoteString(o);} if(typeof o.toJSON==='function'){return $.toJSON(o.toJSON());} if(type==='date'){var month=o.getUTCMonth()+1,day=o.getUTCDate(),year=o.getUTCFullYear(),hours=o.getUTCHours(),minutes=o.getUTCMinutes(),seconds=o.getUTCSeconds(),milli=o.getUTCMilliseconds();if(month<10){month='0'+month;} if(day<10){day='0'+day;} if(hours<10){hours='0'+hours;} if(minutes<10){minutes='0'+minutes;} if(seconds<10){seconds='0'+seconds;} if(milli<100){milli='0'+milli;} if(milli<10){milli='0'+milli;} return'"'+year+'-'+month+'-'+day+'T'+ hours+':'+minutes+':'+seconds+'.'+milli+'Z"';} pairs=[];if($.isArray(o)){for(k=0;k<o.length;k++){pairs.push($.toJSON(o[k])||'null');} return'['+pairs.join(',')+']';} if(typeof o==='object'){for(k in o){if(hasOwn.call(o,k)){type=typeof k;if(type==='number'){name='"'+k+'"';}else if(type==='string'){name=$.quoteString(k);}else{continue;} type=typeof o[k];if(type!=='function'&&type!=='undefined'){val=$.toJSON(o[k]);pairs.push(name+':'+val);}}} return'{'+pairs.join(',')+'}';}};$.evalJSON=typeof JSON==='object'&&JSON.parse?JSON.parse:function(str){return eval('('+str+')');};$.secureEvalJSON=typeof JSON==='object'&&JSON.parse?JSON.parse:function(str){var filtered=str.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered)){return eval('('+str+')');} throw new SyntaxError('Error parsing JSON, source is not valid.');};$.quoteString=function(str){if(str.match(escape)){return'"'+str.replace(escape,function(a){var c=meta[a];if(typeof c==='string'){return c;} c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';} return'"'+str+'"';};}(jQuery));�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/style.css������������������������������������������������������0000664�0000000�0000000�00000014075�12122555434�0021372�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#changelist { top: 20px; } .navi_tab { float:left; padding: 5px 14px 5px 12px; cursor:pointer; border: 1px solid #ccc; border-bottom:none; min-width:100px; margin-top:3px; /* height:13px; */ font-weight: bold; font-size: 12px; background-image:none; color: #333333; background: #E1E1E1 url(img/nav-bg.gif) top repeat-x; } .tab_active { margin-top: 0; padding-top: 6px; padding-bottom: 7px; background: #7BA0C6 url('img/default-bg.gif') top repeat-x; color: white; } #main { clear:both; padding: 10px 10px 10px 10px; border: 1px solid #ccc; margin: 0 0 10px 0; } .panel { display:none; position:relative; padding-bottom:50px; } .order-machine { margin-bottom:10px; } .order-item { margin: 0 0 10px 0; position:relative; } .order-item .handle { position: absolute; top: 0; left: 0; display: block; height: 24px; width: 15px; cursor: move; } .order-item .collapse { cursor: pointer; color: #444; font-weight: normal; } .item-delete { cursor:pointer; float:right; margin: 2px 0px 0px 0; } .highlight, .helper { height: 25px; margin: 0 0 10px 0; border: none; opacity: 0.3; background: url('img/item_editor_form_title.png') no-repeat left bottom; } .helper{ height: 25px !important; opacity: 1; } .button { margin:5px; padding:5px; font-weight: bold; background-image:url('img/nav-bg.gif'); cursor:pointer; border: 1px solid #678; } th { vertical-align: middle; } select { max-width: 580px; } #main_wrapper { margin: 10px 0 30px 0; } textarea { width: 580px; margin-top:5px; margin-bottom:5px; } .inline-group .tabular textarea { width: auto; } .item-minimize { width: 15px; height:15px; float: left; cursor: pointer; margin-left:-17px; } .item-minimize-disabled { width: 15px; height:15px; float: left; margin-left:-17px; } .item-controls { background: url('img/wrench.png') no-repeat 12px center; padding-left:27px; height: 35px; } .item-control-unit { float:left; padding: 3px 10px 0 7px; border-left: 1px solid #eee; } .item-control-unit:first-child { border-left: none; } .machine-control { height:70px; padding: 5px 10px 5px 10px; border: 1px solid #ccc; background-color: #edf3fe; position:absolute; left:-11px; bottom:-30px; width: 100%; } .control-unit { float:left; padding-left: 5px; padding-right:20px; border-left: 1px solid #eee; } .control-unit:first-child { border-left: none; } .control-unit span { font-weight:bold; } a.actionbutton { display: block; background-repeat: no-repeat; width:50px; height:50px; float:left; margin: 5px 20px 0 0; text-indent:-7000px; } a.richtextcontent { background: url(img/contenttypes.png) no-repeat 0 0; } a.richtextcontent:hover { background-position: 0 -70px; } a.imagecontent { background: url(img/contenttypes.png) no-repeat -70px 0; } a.imagecontent:hover { background-position: -70px -70px; } a.gallerycontent { background: url(img/contenttypes.png) no-repeat -140px 0; } a.gallerycontent:hover { background-position: -140px -70px; } a.oembedcontent { background: url(img/contenttypes.png) no-repeat -280px 0; } a.oembedcontent:hover { background-position: -280px -70px; } a.pdfcontent { background: url(img/contenttypes.png) no-repeat -210px 0; } a.pdfcontent:hover { background-position: -210px -70px; } a.audiocontent { background: url(img/contenttypes.png) no-repeat -350px 0; } a.audiocontent:hover { background-position: -350px -70px; } .control-unit select, .control-unit input { position: relative; top: 15px; } .empty-machine-msg { margin:10px 0px 5px 300px; font-style: italic; font-size:14px; color:#999; } td span select { width:600px; } #popup_bg { width:100%; height:100%; background-color:white; opacity: 0.5; filter:alpha(opacity=50); position:absolute; top:0px; left:0px; } /* jQuery alerts */ #popup_container { font-family: Arial, sans-serif; font-size: 12px; min-width: 300px; /* Dialog will be no smaller than this */ max-width: 600px; /* Dialog will wrap after this width */ background: #FFF; border: solid 1px #666; color: #000; } #popup_title { font-size: 14px; font-weight: bold; text-align: center; line-height: 1.75em; color: #666; background: #eee url(img/title.gif) top repeat-x; border: solid 1px #FFF; border-bottom: solid 1px #666; cursor: default; padding: 0em; margin: 0em; } #popup_content { background: 16px 16px no-repeat url(img/info.gif); padding: 1em 1.75em; margin: 0em; } #popup_content.alert { background-image: url(img/info.gif); } #popup_content.confirm { background-image: url(img/important.gif); } #popup_content.prompt { background-image: url(img/help.gif); } #popup_message { padding-left: 48px; } #popup_panel { text-align: center; margin: 1em 0em 0em 1em; } #popup_prompt { margin: .5em 0em; } /* override Django admin styles */ .order-machine fieldset.module > h2{ padding: 4px 5px 6px 17px; background: url(img/item_editor_form_title.png) no-repeat left bottom; } .change-template-button { margin-left: 7em; padding-left: 30px; } /* Allow nested lists in error items */ ul.errorlist ul { margin-left: 1em; padding-left: 0; list-style-type: square; } ul.errorlist li li { /* Avoid repeating the warning image every time*/ background-image:none; padding: 0; } /* tree editor */ .page_marker { display:block; text-align: right; float: left; padding: 1px 1px 0 0; } tr.cut { border: 2px dashed black; opacity: 0.5; } .title-column { width: 400px; } table#result_list :focus { background-color: #ccddff !important; outline: 0px; } #page_form { clear: both; } div.order-machine div.inline-related > h3{ display: none; } .hidden-form-row{ display: none; } /* various overrides */ #id_redirect_to { width: 20em; } /* raw_id_fields act-a-like for redirect_to */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/static/feincms/toolbox.js�����������������������������������������������������0000664�0000000�0000000�00000005157�12122555434�0021545�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Contains universally useful functions */ /* Extract an object id (numeric) from a DOM id. Assumes that a "-" is used as delimiter. Returns either the id found or 0 if something went wrong. extract_item_id('foo_bar_baz-327') -> 327 */ function extract_item_id(elem_id) { var i = elem_id.indexOf('-'); if(i >= 0) return parseInt(elem_id.slice(i+1), 10); return 0; } /* Given an html snippet (in text form), parses it to extract the id attribute, then replace the corresponding element in the page with the snippet. The first parameter is ignored (so the signature matches what $.each expects). replace_element(0, '<div id="replace_me">New Stuff!</div>') */ function replace_element(i, html) { var r_id = $(html).attr('id'); $('#' + r_id).replaceWith(html); } /* Same as above, but processes an array of html snippets */ function replace_elements(data) { $.each(data, replace_element); } /* Setup django csrf-token for ajax calls, necessary since Django 1.2.5 */ /* See http://docs.djangoproject.com/en/1.2/releases/1.2.5/#csrf-exception-for-ajax-requests */ $.ajaxSetup({ beforeSend: function(xhr, settings) { function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { // Only send the token to relative URLs i.e. locally. xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); } } }); /* OnClick handler to toggle a boolean field via AJAX */ function inplace_toggle_boolean(item_id, attr) { var deferred = $.Deferred(); $.ajax({ url: ".", type: "POST", dataType: "json", data: { '__cmd': 'toggle_boolean', 'item_id': item_id, 'attr': attr }, success: function(data) { replace_elements(data); deferred.resolve(); }, error: function(xhr, status, err) { alert("Unable to toggle " + attr + ": " + xhr.responseText); } }); return deferred.promise(); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0016574�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/��������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0017664�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/content/������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021336�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/content/richtext/���������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0023170�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/content/richtext/init_ckeditor.html���������������������������0000664�0000000�0000000�00000003145�12122555434�0026710�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<script type="text/javascript" src="{{ CKEDITOR_JS_URL }}"></script> <style type="text/css"> span.cke_skin_kama { border: none !important; } div[id*='cke_id_'] { margin-left: 107px; } </style> <script type="text/javascript"> {% block config %} CKEDITOR.config.width = '787'; CKEDITOR.config.height= '300'; CKEDITOR.config.toolbar = [ {% block toolbar %}['Maximize','-','Format','-','Bold','Italic','Underline','Strike','-','Subscript','Superscript','-','NumberedList','BulletedList','-','Anchor', 'Link','Unlink','-','Source']{% endblock %} ]; {% endblock %} (function($){ contentblock_init_handlers.push(function(){ $('.order-machine textarea.item-richtext, #frontend_editor textarea.item-richtext').each(function(){ feincms_richtext_add_ckeditor(this); }); contentblock_move_handlers.poorify.push(function(item) { item.find('textarea.item-richtext').each(feincms_richtext_remove_ckeditor); }); contentblock_move_handlers.richify.push(function(item) { item.find('textarea.item-richtext').each(feincms_richtext_add_ckeditor); }); }); })(feincms.jQuery); function feincms_richtext_remove_ckeditor(field) { var id = field ? field.id : this.id; if (id in CKEDITOR.instances) { CKEDITOR.instances[id].destroy(); } } function feincms_richtext_add_ckeditor(field) { var id = field ? field.id : this.id; if (!(id in CKEDITOR.instances)) { CKEDITOR.replace(id); } } </script> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/content/richtext/init_tinymce.html����������������������������0000664�0000000�0000000�00000005454�12122555434�0026561�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% block tinymce_script %} {% if TINYMCE_JS_URL %} <script type="text/javascript" src="{{ TINYMCE_JS_URL }}"></script> {% endif %} {% endblock %} {% block tinymce_init %} <script type="text/javascript"> {% block functions %}{% endblock %} tinyMCE.init({ mode: "none", {% block settings %} theme: "advanced", language: "en", theme_advanced_toolbar_location: "top", theme_advanced_toolbar_align: "left", theme_advanced_statusbar_location: "bottom", theme_advanced_buttons1: "{% block buttons1 %}fullscreen,|,formatselect,|,bold,italic,|,sub,sup,|,bullist,numlist,|,anchor,link,unlink,|,code{% endblock %}", theme_advanced_buttons2: "{% block buttons2 %}{% endblock %}", theme_advanced_buttons3: "{% block buttons3 %}{% endblock %}", theme_advanced_path: false, theme_advanced_blockformats: "{% block blockformats %}p,h2,h3{% endblock %}", theme_advanced_resizing: true, width: '680', height: '300', {% if TINYMCE_CONTENT_CSS_URL %}content_css: "{{ TINYMCE_CONTENT_CSS_URL }}",{% endif %} {% if TINYMCE_LINK_LIST_URL %}external_link_list_url: "{{ TINYMCE_LINK_LIST_URL }}",{% endif %} {% if TINYMCE_INIT_INSTANCE_CALLBACK %}init_instance_callback: "{{TINYMCE_INIT_INSTANCE_CALLBACK}}",{% endif %} plugins: "{% block plugins %}fullscreen,paste{% endblock %}", paste_auto_cleanup_on_paste: true, relative_urls: false {% endblock %} }); (function($){ var tinymce_added = {}; function feincms_richtext_remove_tinymce(field) { var id = field ? field.id : this.id; if(tinymce_added[id]) { tinyMCE.execCommand('mceRemoveControl', false, id); tinymce_added[id] = false; } } function feincms_richtext_add_tinymce(field) { var id = field ? field.id : this.id; if(!tinymce_added[id]) { tinyMCE.execCommand('mceAddControl', false, id); tinymce_added[id] = true; } } var richtext_init_fn = function(){ $('{% block selectors %}.order-machine textarea.item-richtext, #frontend_editor textarea.item-richtext{% endblock %}').each(function(){ feincms_richtext_add_tinymce(this); }); } {% block enable %} contentblock_init_handlers.push(richtext_init_fn); contentblock_move_handlers.poorify.push(function(item) { item.find('textarea.item-richtext').each(feincms_richtext_remove_tinymce); }); contentblock_move_handlers.richify.push(function(item) { item.find('textarea.item-richtext').each(feincms_richtext_add_tinymce); }); {% endblock %} })(feincms.jQuery); </script> {% endblock %} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/content/table/������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0022425�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/content/table/init.html���������������������������������������0000664�0000000�0000000�00000017617�12122555434�0024272�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n %} <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery.json-2.4.min.js"></script> <script type="text/javascript"> //<![CDATA[ /* * Copyright (c) 2008 Greg Weber greg at gregweber.info * Dual licensed under the MIT and GPL licenses * * jquery plugin * make an html table editable by the user * user clicks on a cell, edits the value, * then presses enter or clicks on any cell to save the new value * pressing escape returns the cell text to its orignal text * * documentation at http://gregweber.info/projects/uitableedit * * var t = $('table') * $.uiTableEdit( t ) // returns t * * options : off, mouseDown, find, dataEntered, dataVerify, editDone * off : turns off table editing * find : defaults to tbody > tr > td * mousedown : called in context of the table cell (as a normal event would be) * if mouseDown returns false, cell will not become editable * dataVerify : called in context of the cell, * if dataVerify returns false, cell will stay in editable state * if dataVerify returns text, that text will replace the cell's text * arguments are the cell's text, original text, event, jquery object for the cell * editDone : invoked on completion * arguments: td cell's new text, original text, event, and jquery element for the td cell */ (function($){ $.uiTableEdit = function(jq, options){ function unbind(){ return jq.find( options.find ).unbind('mousedown.uiTableEdit') } options = options || {} options.find = options.find || 'tbody > tr > td' if( options.off ){ unbind().find('form').each( function(){ var f = $(this); f.parents("td:first").text( f.find(':text').attr('value') ); f.remove(); }); return jq; } function bind_mouse_down( mouseDn ){ unbind().bind('mousedown.uiTableEdit', mouseDn ) } function td_edit(){ var td = $(this); function restore(e){ var val = td.find('textarea').val(); if( options.dataVerify ){ var value = options.dataVerify.call(this, val, orig_text, e, td); if( value === false ){ return false; } if( value !== null && value !== undefined ) val = value; } td.html( "" ); td.text( val ); if( options.editDone ) options.editDone(val,orig_text,e,td) bind_mouse_down( td_edit_wrapper ); } function checkEscape(e){ if (e.keyCode === 27) { td.html( "" ); td.text( orig_text ); bind_mouse_down( td_edit_wrapper ); } else if (e.keyCode === 13 && !e.shiftKey) { restore(e); } } var orig_text = td.text(); var w = td.width(); var h = td.height(); td.html( '<form name="td-editor" action="javascript:void(0);">' + '<textarea type="text" name="td_edit">' + td.text() + '</textarea></form>' ) .find('form').submit( restore ).mousedown( restore ).blur( restore ).keypress( checkEscape ); var textarea = td.find('textarea'); textarea.css('min-width', '150px').css('min-height', Math.max(150, textarea[0].scrollHeight)+'px'); function focus_text(){ td.find('textarea').get(0).focus() } // focus bug (seen in FireFox) fixed by small delay setTimeout(focus_text, 50); /* TODO: investigate removing bind_mouse_down I also got rid of bind_mouse_down(restore), because now that you can refocus on fields that have been blurred, you can have multiple edits going simultaneously */ bind_mouse_down( restore ); } var td_edit_wrapper = !options.mouseDown ? td_edit : function(){ if( options.mouseDown.apply(this,arguments) == false ) return false; td_edit.apply(this,arguments); }; bind_mouse_down( td_edit_wrapper ); return jq; } function td_edit_editDone(value, original, event, td) { var table = $(td).parents('table'); var data = []; table.find('tr').each(function(){ var row = []; $('td', this).each(function(){ row.push($(this).html()); }); if(row.length) data.push(row); }); table.siblings('textarea').val($.toJSON(data)); } var tablecontent_added = {}; contentblock_init_handlers.push(function(){ $('.order-machine textarea[name*=tablecontent]').each(function(){ if (tablecontent_added[this.id]) return; tablecontent_added[this.id] = true; var textarea = $(this); var data = $.secureEvalJSON(textarea.val() || '[[""]]'); var html = '<table class="tablecontent" border="1">'; html += '<tr><th></th>'; for(var i=0; i<data[0].length; i++) { html += '<th><span class="remove-col">-</span> column <span class="insert-col">+</span></th>'; } html += '</tr>'; for(var i=0; i<data.length; i++) { html += '<tr>'; html += '<th><span class="remove-row">-</span> row <span class="insert-row">+</span></th>'; for(var j=0; j<data[i].length; j++) { html += '<td>'+data[i][j]+'</td>'; } html += '</tr>'; } html += '</table>'; var table = textarea.hide().after(html).siblings('table'); $.uiTableEdit(table, {editDone: td_edit_editDone}); }); }); $('table.tablecontent th span.insert-col').live('click', function(){ var row = $(this.parentNode.parentNode); var index = row.find('th').index(this.parentNode)-1; // first row has empty TH at the beginning var cell = $(this.parentNode); var table = row.parents('table'); cell.after(cell.clone()); table.find('tbody tr').each(function(){ $('td:eq('+index+')', this).after('<td></td>'); }); $.uiTableEdit(table, {editDone: td_edit_editDone}); return false; }); $('table.tablecontent th span.remove-col').live('click', function(){ var row = $(this.parentNode.parentNode); var index = row.find('th').index(this.parentNode)-1; // first row has empty TH at the beginning var cell = $(this.parentNode); var table = row.parents('table'); // prevent removal of last column if(table.find('tr:eq(0) th').length<=2) return false; cell.remove(); table.find('tbody tr').each(function(){ $('td:eq('+index+')', this).remove(); }); $.uiTableEdit(table, {editDone: td_edit_editDone}); return false; }); $('table.tablecontent th span.insert-row').live('click', function(){ var row = $(this.parentNode.parentNode); var table = row.parents('table'); row.after(row.clone()).next().find('td').empty(); $.uiTableEdit(table, {editDone: td_edit_editDone}); return false; }); $('table.tablecontent th span.remove-row').live('click', function(){ var table = $(this).parents('table'); if(table.find('tr').length<=2) return false; $(this.parentNode.parentNode).remove(); // TODO regenerate JSON return false; }); })(feincms.jQuery); //]]> </script> <style type="text/css"> table.tablecontent { width: 620px; } table.tablecontent th { font-weight: normal; background: #eef; text-align: center; } table.tablecontent th span { cursor: pointer; } table.tablecontent td { border: 1px solid #cccccc; white-space: pre-wrap; } table.tablecontent form { border: 1px dashed #000; white-space: normal; } table.tablecontent form textarea { width: auto; border: 0; margin-top: 0; margin-bottom: 0; margin: 0 0 0 0; padding: 0 0 0 0; background: inherit; } </style> �����������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021310�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/_content_type_buttons.html����������������������������0000664�0000000�0000000�00000002655�12122555434�0026636�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load url from future %} <script type="text/javascript"> /* type: content type identifier (required) cssclass: quickbutton CSS class raw_id_picker: URL of raw_id_fields picker which should be automatically opened after: callback, receives new fieldset as argument keep: keep entry in content type dropdown (defaults to false) */ {% url "admin:medialibrary_mediafile_changelist" as media_library_url %} var CONTENT_TYPE_BUTTONS = [ { type: 'richtextcontent', keep: true }, { type: 'imagecontent', keep: true }, { type: 'filecontent', keep: true, cssclass: 'pdfcontent' }, { type: 'videocontent', keep: true, cssclass: 'oembedcontent' {% if media_library_url %} }, { type: 'mediafilecontent', keep: true, cssclass: 'imagecontent', raw_id_picker: '{{ media_library_url }}?type__exact=image&pop=1' }, { type: 'gallerycontent', keep: true }, { type: 'mediafilecontent', keep: true, cssclass: 'pdfcontent', raw_id_picker: '{{ media_library_url }}?type__exact=pdf&pop=1' {% endif %} }, { type: 'oembedcontent', keep: true {% if media_library_url %} }, { type: 'mediafilecontent', keep: true, cssclass: 'audiocontent', raw_id_picker: '{{ media_library_url }}?type__exact=audio&pop=1' {% endif %} } ]; </script> �����������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/_messages_js.html�������������������������������������0000664�0000000�0000000�00000001655�12122555434�0024647�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n %} <script type="text/javascript" charset="utf-8"> DELETE_MESSAGES = ["{% trans "Really delete item?" %}", "{% trans "Confirm to delete item" %}", "{% trans "Item deleted successfully." %}", "{% trans "Cannot delete item" %}", "{% trans "Cannot delete item, because it is parent of at least one other item." %}"]; CHANGE_TEMPLATE_MESSAGES = ["{% trans "Change template" %}", "{% trans "Really change template? <br />All changes are saved." %}", "{% trans "Really change template? <br />All changes are saved and content from <strong>%(source_regions)s</strong> is moved to <strong>%(target_region)s</strong>." %}"]; FEINCMS_ITEM_EDITOR_GETTEXT = { 'Hide': "{% trans "Hide" %}" , 'Show': "{% trans "Show" %}" , 'After': "{% trans "After" %}" , 'Before': "{% trans "Before" %}" , 'Insert new:': "{% trans "Insert new:" %}" }; </script> �����������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/_regions_js.html��������������������������������������0000664�0000000�0000000�00000002374�12122555434�0024505�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<script type="text/javascript" charset="utf-8"> IMG_DELETELINK_PATH = "{{ STATIC_URL }}feincms/img/icon_deletelink.gif"; REGION_MAP = [{% for region in original.template.regions %}'{{ region.key }}'{% if not forloop.last %}, {% endif %}{% endfor %}]; REGION_NAMES = [{% for region in original.template.regions %}'{{ region.title|capfirst }}'{% if not forloop.last %}, {% endif %}{% endfor %}]; ACTIVE_REGION = 0; CONTENT_NAMES = { {% for name, value in content_types %}'{{ value }}': '{{ name|capfirst }}'{% if not forloop.last %},{% endif %} {% endfor %} }; var contentblock_init_handlers = []; var contentblock_move_handlers = {poorify: [ function(item) {item.find('.item-content').hide();}, function(item) {item.find('input[type=radio][checked]').addClass('radiochecked');} ], richify: [ function(item) {item.find('.item-content').show();}, function(item) {item.find('input.radiochecked').removeClass('radiochecked').trigger('click');} ]}; var template_regions = { {% for template in available_templates.values %}'{{ template.key }}': [{% for region in template.regions %}'{{ region.key }}'{% if not forloop.last %}, {% endif %}{% endfor %}]{% if not forloop.last %},{% endif %} {% endfor %} }; </script> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/content_editor.html�����������������������������������0000664�0000000�0000000�00000003341�12122555434�0025217�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n %} {% load feincms_tags %} <div id="main_wrapper"> {% for region in original.template.regions %} <div class="navi_tab" id="{{ region.key }}_tab">{{ region.title }}</div> {% endfor %} <div id="main"> {% for region in original.template.regions %} <div id="{{ region.key }}_body" class="panel"> <div class="empty-machine-msg"> {% if adding_translation and forloop.first %} <div> <p> <input type="checkbox" name="_copy_content_from_original" id="_copy_content_from_original" checked="checked" /> <label for="_copy_content_from_original">{% trans "Copy content from the original" %} ("{{ translation_of }}", {% trans translation_of.get_language_display %})</label> </p> </div> {% else %} {% trans "Region empty" %} {% endif %} </div> <div class="empty-machine-msg" style="margin-left:20px; margin-top:20px;"> {% if region.inherited %} {% trans "Content from the parent site is automatically inherited. To override this behaviour, add some content." %} {% endif %} </div> <div class="order-machine"></div> <div class="machine-control"> <div class="control-unit"> <span>{% trans "Add new item" %}:</span> <br/> {% show_content_type_selection_widget region %} <input type="button" class="order-machine-add-button button" value="Go" /> </div> </div> </div> {% endfor %} </div> </div> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/content_inline.html�����������������������������������0000664�0000000�0000000�00000013054�12122555434�0025211�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n admin_static feincms_admin_tags %} <div class="inline-group feincms_inline" id="{{ inline_admin_formset.formset.prefix }}-group"> <h2>{{ inline_admin_formset.opts.verbose_name_plural|title }}</h2> {{ inline_admin_formset.formset.management_form }} {{ inline_admin_formset.formset.non_form_errors }} {% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if forloop.last %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}"> <h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b> <span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% else %}#{{ forloop.counter }}{% endif %}</span> {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.pk }}/">{% trans "View on site" %}</a>{% endif %} {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %} </h3> {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} {% for fieldset in inline_admin_form %} <fieldset class="module aligned {{ fieldset.classes }}"> {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %} {% if fieldset.description %} <div class="description">{{ fieldset.description|safe }}</div> {% endif %} {% for line in fieldset|post_process_fieldsets %} <div class="form-row{% if line.errors %} errors{% endif %}{% for field in line %} {{ field.field.name }}{% endfor %}"> {{ line.errors }} {% for field in line %} <div{% if not line.fields|length_is:"1" %} class="field-box"{% endif %}> {% if field.is_checkbox %} {{ field.field }}{{ field.label_tag }} {% else %} {{ field.label_tag }} {% if field.is_readonly %} <p>{{ field.contents }}</p> {% else %} {{ field.field }} {% endif %} {% endif %} {% if field.field.field.help_text %} <p class="help">{{ field.field.field.help_text|safe }}</p> {% endif %} </div> {% endfor %} </div> {% endfor %} </fieldset> {% endfor %} {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %} {{ inline_admin_form.fk_field.field }} </div>{% endfor %} </div> <script type="text/javascript"> (function($) { $(document).ready(function() { var rows = "#{{ inline_admin_formset.formset.prefix }}-group .inline-related"; var updateInlineLabel = function(row) { $(rows).find(".inline_label").each(function(i) { var count = i + 1; $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); }); } var reinitDateTimeShortCuts = function() { // Reinitialize the calendar and clock widgets by force, yuck. if (typeof DateTimeShortcuts != "undefined") { $(".datetimeshortcuts").remove(); DateTimeShortcuts.init(); } } var updateSelectFilter = function() { // If any SelectFilter widgets were added, instantiate a new instance. if (typeof SelectFilter != "undefined"){ $(".selectfilter").each(function(index, value){ var namearr = value.name.split('-'); SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% static "admin/" %}"); }); $(".selectfilterstacked").each(function(index, value){ var namearr = value.name.split('-'); SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% static "admin/" %}"); }); } } var initPrepopulatedFields = function(row) { row.find('.prepopulated_field').each(function() { var field = $(this); var input = field.find('input, select, textarea'); var dependency_list = input.data('dependency_list') || []; var dependencies = row.find(dependency_list.join(',')).find('input, select, textarea'); if (dependencies.length) { input.prepopulate(dependencies, input.attr('maxlength')); } }); } $(rows).formset({ prefix: "{{ inline_admin_formset.formset.prefix }}", addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}", formCssClass: "dynamic-{{ inline_admin_formset.formset.prefix }}", deleteCssClass: "inline-deletelink", deleteText: "{% trans "Remove" %}", emptyCssClass: "empty-form", removed: updateInlineLabel, added: (function(row) { initPrepopulatedFields(row); reinitDateTimeShortCuts(); updateSelectFilter(); updateInlineLabel(row); }) }); }); })(django.jQuery); </script> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/content_type_selection_widget.html��������������������0000664�0000000�0000000�00000000540�12122555434�0030320�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<select name="order-machine-add-select"> {% for v,n in ungrouped %}<option value="{{ v }}">{{ n|capfirst }}</option> {% endfor %} {% for label,cts in grouped.items %} <optgroup label="{{ label }}"> {% for v,n in cts %}<option value="{{ v }}">{{ n|capfirst }}</option> {% endfor %} </optgroup> {% endfor %} </select> ����������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/fe_box.html�������������������������������������������0000664�0000000�0000000�00000000103�12122555434�0023432�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<div class="fe_box" id="{{ identifier }}">{{ content|safe }}</div> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/fe_editor.html����������������������������������������0000664�0000000�0000000�00000002436�12122555434�0024143�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/change_form.html" %} {% load i18n admin_modify %} {% block extrahead %}{{ block.super }} <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-ui-1.8.22.custom.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery.alerts.js"></script> <script type="text/javascript"> var feincms = { {% if FEINCMS_JQUERY_NO_CONFLICT %} "jQuery": jQuery.noConflict(true) {% else %} "jQuery": jQuery {% endif %} }; </script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/item_editor.js"></script> {% include "admin/feincms/_messages_js.html" %} {% include "admin/feincms/_regions_js.html" %} {% for inc in object.feincms_item_editor_includes.head %}{% include inc %}{% endfor %} {% endblock %} {% block content %} <div class="content_main" id="frontend_editor"> <form method="post" action="."> {% csrf_token %} <div> {% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %} <table> {{ form }} </table> <div class="submit-row" > <input type="submit" value="{% trans "Save" %}" class="default" name="_save" /> </div> </div> </form> </div> {% endblock %} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/fe_editor_done.html�����������������������������������0000664�0000000�0000000�00000001175�12122555434�0025147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-ui-1.8.22.custom.min.js"></script> <script type="text/javascript"> var feincms = { {% if FEINCMS_JQUERY_NO_CONFLICT %} "jQuery": jQuery.noConflict(true) {% else %} "jQuery": jQuery {% endif %} }; </script> <div id="{{ identifier }}-new"> {{ content|safe }} </div> <script type="text/javascript"> opener.feincms.fe_update_content('{{ identifier }}', feincms.jQuery('#{{ identifier }}-new').html()); window.close(); </script> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/fe_tools.html�����������������������������������������0000664�0000000�0000000�00000002573�12122555434�0024017�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n %} {% load url from future %} <script type="text/javascript" charset="utf-8"> (function () { // load jQuery if not yet present if (typeof(feincms) == "undefined") { var jquery_url = "{{ STATIC_URL }}feincms/jquery-1.8.3.min.js"; document.write(unescape('%3Cscript src="' + jquery_url + '" type="text/javascript"%3E%3C/script%3E')); } })(); </script> <script type="text/javascript"> var feincms = { "admin_index": "{% url "admin:index" %}", {% if FEINCMS_JQUERY_NO_CONFLICT %} "jQuery": jQuery.noConflict(true) {% else %} "jQuery": jQuery {% endif %} }; </script> <script src="{{ STATIC_URL }}feincms//frontend_editing.js" type="text/javascript" charset="utf-8"></script> <link rel="stylesheet" href="{{ STATIC_URL }}feincms//frontend_editing.css" type="text/css" media="screen" charset="utf-8"> <div id="fe_controls"> <a href="?frontend_editing=0">{% trans "Stop Editing" %}</a> <a href="{% url "admin:page_page_change" feincms_page.pk %}">Admin Page</a> </div> <div id="fe_tools"> <a id="fe_tools_edit" href="#">{% trans "edit" %}</a> <!-- <a id="fe_tools_new" href="#">{% trans "new" %}</a> <a id="fe_tools_up" href="#">{% trans "up" %}</a> <a id="fe_tools_down" href="#">{% trans "down" %}</a> <a id="fe_tools_remove" href="#">{% trans "remove" %}</a> --> </div> �������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/item_editor.html��������������������������������������0000664�0000000�0000000�00000004773�12122555434�0024515�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/change_form.html" %} {% load i18n admin_modify %} {% block extrahead %}{{ block.super }} {% block feincms_jquery_ui %} <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-ui-1.8.22.custom.min.js"></script> {% endblock %} <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}feincms/style.css" /> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery.alerts.js"></script> <script type="text/javascript"> var feincms = { {% if FEINCMS_JQUERY_NO_CONFLICT %} "jQuery": jQuery.noConflict(true) {% else %} "jQuery": jQuery {% endif %} }; </script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/item_editor.js"></script> {% include "admin/feincms/_messages_js.html" %} {% include "admin/feincms/_regions_js.html" %} {% include "admin/feincms/_content_type_buttons.html" %} {% for inc in model.feincms_item_editor_includes.head %}{% include inc %}{% endfor %} <script type="text/javascript"> feincms.jQuery(document).ready(function($){ {% block extra-init-js %}{# /* do not use this block, use feincms_item_editor_includes instead */ #}{% endblock %} }); </script> {% endblock %} {% block form_top %} {% with original.available_translations as translations %} {% for translation in translations %} {# look for something the translation extension's available_translations method might return #} {% if translation.id %} {% if forloop.first %} <div style="float: right;padding: 5px 0 0 0" id="available_translations"> {% trans "available translations" %}: {% endif %} <a href="../{{ translation.id }}/" title="{{ translation }}">{{ translation.language|upper }}</a>{% if not forloop.last %},{% endif %} {% if forloop.last %} </div> <script type="text/javascript"> feincms.jQuery(function($){ $('#id_language').parent().prepend($('#available_translations')); }); </script> {% endif %} {% endif %}{% endfor %} {% endwith %} {% endblock %} {% block after_related_objects %} {# as good a place as any... #} {{ block.super }} <div id="content-editor-fieldset" style="display: none"> {% include "admin/feincms/content_editor.html" %} </div> <script type="text/javascript"> feincms.jQuery(function($){ $("h2:contains('{{ FEINCMS_CONTENT_FIELDSET_NAME }}')").parent().replaceWith($("#main_wrapper")); }); </script> {% endblock %} �����feincms-1.7.4/feincms/templates/admin/feincms/page/�������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0022224�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/page/page/��������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0023140�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/page/page/item_editor.html����������������������������0000664�0000000�0000000�00000002224�12122555434�0026332�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/feincms/item_editor.html" %} {% load url from future %} {% load i18n %} {% block object-tools %} {{ block.super }} <ul class="extra-object-tools"> {% if original.is_active and FEINCMS_FRONTEND_EDITING %} <li><a target="_blank" href="{{ original.get_absolute_url }}?frontend_editing=1" class="frontend_editing_link">{% trans "Edit on site" %}</a></li> {% endif %} {% if not original.is_active %} {% url "feincms_preview" original.get_absolute_url|slice:"1:-1" original.pk as preview_url %} {% if preview_url %} <li><a target="_blank" href="{{ preview_url }}" class="viewsitelink">{% trans "Preview" %}</a></li> {% endif %} {% endif %} </ul> {% endblock %} {% block breadcrumbs %} <div class="breadcrumbs"> <a href="../../../">{% trans "Home" %}</a> › <a href="../">{{ opts.verbose_name_plural|capfirst }}</a> › {% if add %} {% trans "Add" %} {{ opts.verbose_name }} {% else %} {% for p in original.get_ancestors %} <a href="../{{ p.id }}/">{{ p.short_title }}</a> : {% endfor %} {{ original.short_title }} {% endif %} </div> {% endblock %} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/page/page/tree_editor.html����������������������������0000664�0000000�0000000�00000000357�12122555434�0026340�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/feincms/tree_editor.html" %} {% load i18n %} {% block breadcrumbs %} <div class="breadcrumbs"> <a href="../../">{% trans "Home" %}</a> › {{ cl.opts.verbose_name_plural|capfirst }} </div> {% endblock %} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/recover_form.html�������������������������������������0000664�0000000�0000000�00000001452�12122555434�0024670�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/feincms/item_editor.html" %} {% load url from future %} {% load i18n %} {% block breadcrumbs %} <div class="breadcrumbs"> <a href="{% url "admin:index" %}">{% trans "Home" %}</a> › <a href="{% url "admin:app_list" app_label %}">{{app_label|capfirst|escape}}</a> › <a href="{{changelist_url}}">{{opts.verbose_name_plural|capfirst}}</a> › <a href="{{recoverlist_url}}">{% blocktrans with opts.verbose_name as verbose_name %}Recover deleted {{verbose_name}}{% endblocktrans %}</a> › {{title}} </div> {% endblock %} {% block form_top %} <p>{% blocktrans %}Press the save button below to recover this version of the object.{% endblocktrans %}</p> {% endblock %} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/feincms/revision_form.html������������������������������������0000664�0000000�0000000�00000001760�12122555434�0025063�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/feincms/item_editor.html" %} {% load url from future %} {% load i18n %} {% block breadcrumbs %} <div class="breadcrumbs"> <a href="{% url "admin:index" %}">{% trans "Home" %}</a> › <a href="{% url "admin:app_list" app_label %}">{{app_label|capfirst|escape}}</a> › <a href="{{changelist_url}}">{{opts.verbose_name_plural|capfirst}}</a> › <a href="{{change_url}}">{{original|truncatewords:"18"}}</a> › <a href="../">{% trans "History" %}</a> › {% blocktrans with opts.verbose_name as verbose_name %}Revert {{verbose_name}}{% endblocktrans %} </div> {% endblock %} {% block content %} {% with 1 as is_popup %} {{block.super}} {% endwith %} {% endblock %} {% block form_top %} <p>{% blocktrans %}Press the save button below to revert to this version of the object.{% endblocktrans %}</p> {% endblock %} ����������������feincms-1.7.4/feincms/templates/admin/feincms/tree_editor.html��������������������������������������0000664�0000000�0000000�00000003026�12122555434�0024504�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/change_list.html" %} {% load admin_list i18n %} {% block extrahead %} {{ block.super }} <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}feincms/style.css" /> <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}feincms/fein_tree.css" /> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery-ui-1.8.22.custom.min.js"></script> <script type="text/javascript"> var feincms = { {% if FEINCMS_JQUERY_NO_CONFLICT %} "jQuery": jQuery.noConflict(true) {% else %} "jQuery": jQuery {% endif %} , "tree_structure": {{ tree_structure|default:"null" }} }; </script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/ie_compat.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/jquery.cookie.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/toolbox.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}feincms/fein_tree.js"></script> {% endblock %} {% block filters %} {% if cl.has_filters %} <div id="changelist-filter"> <h2>{% trans 'Shortcuts' %}</h2> <ul> <li><a id="collapse_entire_tree" href="#">{% trans 'Collapse tree' %}</a></li> <li><a id="open_entire_tree" href="#">{% trans 'Expand tree' %}</a></li> </ul> <h2>{% trans 'Filter' %}</h2> {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} </div> {% endif %} {% endblock %} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/filter.html���������������������������������������������������0000664�0000000�0000000�00000001575�12122555434�0022047�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n %} <script type="text/javascript">var go_from_select = function(opt) { window.location = window.location.pathname + opt };</script> <h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3> <ul class="admin-filter-{{ title|cut:' ' }}"> {% if choices|slice:"4:" %} <li> <select style="width: 95%;" onchange="go_from_select(this.options[this.selectedIndex].value)"> {% for choice in choices %} <option{% if choice.selected %} selected="selected"{% endif %} value="{{ choice.query_string|iriencode }}">{{ choice.display }}</option> {% endfor %} </select> </li> {% else %} {% for choice in choices %} <li{% if choice.selected %} class="selected"{% endif %}> <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a></li> {% endfor %} {% endif %} </ul>�����������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/medialibrary/�������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0022330�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/medialibrary/add_to_category.html�����������������������������0000664�0000000�0000000�00000001371�12122555434�0026347�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/change_form.html" %} {% load i18n %} {% block title %}{% trans "Add media files to category" %} {{ block.super }}{% endblock %} {% block content %} <div id="content-main"> <h1>{% trans "Add media files to category" %}</h1> <p>{% trans "Select category to apply:" %}</p> <form action="" method="post">{% csrf_token %} <div> {{ category_form.as_p }} <p>{% trans "The following media files will be added to the selected category:" %}</p> <ul>{{ mediafiles|unordered_list }}</ul> <input type="hidden" name="action" value="assign_category"> <input type="submit" name="apply" value="{% trans "Add to category" %}"> <input type="submit" name="cancel" value="{% trans "Cancel" %}"> </div> </form> </div> {% endblock %} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/medialibrary/mediafile/���������������������������������������0000775�0000000�0000000�00000000000�12122555434�0024247�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/admin/medialibrary/mediafile/change_list.html�����������������������0000664�0000000�0000000�00000002332�12122555434�0027415�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/change_list.html" %} {% load url from future %} {% load i18n %} {% block content %}{{ block.super }} <div class="module"> <form action="{% url "admin:mediafile_bulk_upload" %}" method="POST" enctype="multipart/form-data"> {% csrf_token %} <p style="color: #666; font-size: 11px;"> <label for="data">{% trans "Bulk upload a ZIP file:" %} <input type="file" name="data"> </label> | {% trans "Category" %} <select name="category"> <option value="">---</option> {% for cat in categories %} <option value="{{ cat.id }}">{{ cat.path }}</option> {% endfor %} </select> | {% trans "Overwrite" %} <input type="checkbox" name="overwrite"> | <input type="submit" value="{% trans "Send" %}"> </p> </form> </div> <script type="text/javascript"> if (window.location.href.indexOf('pop=1') != -1) { (function($){ $(function() { $('#result_list img').bind('click', function() { $(this).parents('tr').find('th:nth(0) a').trigger('click'); return false; }); }); })(django.jQuery); } </script> {% endblock %} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/breadcrumbs.html����������������������������������������������������0000664�0000000�0000000�00000000404�12122555434�0021751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<ul class="breadcrumbs"> {% for url, title in trail %} <li> {% if url %} <a href="{{ url }}">{{ title }}</a> {% else %} {{ title }} {% endif %} </li> {% endfor %} </ul>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0020246�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/comments/���������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0022073�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/comments/default.html���������������������������������������0000664�0000000�0000000�00000002465�12122555434�0024414�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load comments i18n %} {% block comment-separator %} <br /> {% endblock %} {% get_comment_count for parent as comment_count %} {% if comment_count %} {% blocktrans %}{{ comment_count }} comments.{% endblocktrans %} {% block comment-list %} <ul class="comment-list"> {% get_comment_list for parent as comment_list %} {% for comment in comment_list %} <li class="comment-list-entry"> {% block comment-list-entry %} {% blocktrans with comment.user.username as comment_username and comment.submit_date|date:"Y-m-d H:i" as comment_submit_date %} {{ comment_username }} said on {{ comment_submit_date }}<br /> {% endblocktrans %} {{ comment.comment }} {% endblock comment-list-entry %} </li> {% endfor %} </ul> {% endblock comment-list %} {% else %} {% trans "No comments." %} {% endif %} {% block comment-form %} {% if content.comments_enabled %} <form action="{{ feincms_page.get_absolute_url }}" method="post" id="form-comment"> {% csrf_token %} {{ form.as_p }} <input type="submit" name="post" id="submit" value="{% trans "Post Comment" %}" /> </form> {% endif %} {% endblock comment-form %} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/contactform/������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0022565�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/contactform/email.txt���������������������������������������0000664�0000000�0000000�00000000073�12122555434�0024415�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% for k, v in data.items %} {{ k }}: {{ v }} {% endfor %} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/contactform/form.html���������������������������������������0000664�0000000�0000000�00000000452�12122555434�0024417�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n %} <div class="contactform"> <form method="post" action="."> {% csrf_token %} <table> {{ form }} <tr class="submit"> <td> </td> <td><input type="submit" value="{% trans "Submit" %}" /></td> </tr> </table> </form> </div> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/contactform/thanks.html�������������������������������������0000664�0000000�0000000�00000000122�12122555434�0024736�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load i18n %} <div class="contactform"> <p>{% trans "Thanks!" %}</p> </div> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/file/�������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021165�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/file/default.html�������������������������������������������0000664�0000000�0000000�00000000274�12122555434�0023502�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<a class="file-content" href="{{ content.file.url }}"> <span class="file-title">{{ content.title }}</span> <span class="file-size">({{ content.file.size|filesizeformat }})</span> </a> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/image/������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021330�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/image/default.html������������������������������������������0000664�0000000�0000000�00000000530�12122555434�0023640�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<div class="image-content{% if content.position %} image-content-{{ content.position }}{% endif %}{% if content.format %} image-content-format-{{ content.format|slugify }}{% endif %}"><img src="{{ content.get_image.url }}" alt="{{ content.alt_text }}" />{% if content.caption %}<div class="caption">{{ content.caption }}</div>{% endif %}</div> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/mediafile/��������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0022165�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/mediafile/default.html��������������������������������������0000664�0000000�0000000�00000000352�12122555434�0024477�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<a href="{{ content.mediafile.file.url }}"> {{ content.mediafile.translation.caption|default:content.mediafile.file.name }} {% if content.mediafile.copyright %} ({{ content.mediafile.copyright }}) {% endif %} </a> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/mediafile/image.html����������������������������������������0000664�0000000�0000000�00000000501�12122555434�0024131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<div class="image"> <img src="{{ content.mediafile.file.url }}" alt="{{ content.mediafile.translation.caption }}" /> <span class="caption">{{ content.mediafile.translation.caption }}</span> {% if content.mediafile.copyright %}<span class="copyright">{{ content.mediafile.copyright }}</span>{% endif %} </div> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/mediafile/mp3.html������������������������������������������0000664�0000000�0000000�00000000526�12122555434�0023555�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<p id="audioplayer_{{ content.id }}">{{ content.mediafile.translation.caption }}</p> <script type="text/javascript"> AudioPlayer.embed("audioplayer_{{ content.id }}", {soundFile: "{{ content.mediafile.file.url }}"}); </script> <p>{{ content.mediafile.translation.caption }} <a href="{{ content.mediafile.file.url }}">(Download)</a></p> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/richtext/���������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0022100�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/richtext/default.html���������������������������������������0000664�0000000�0000000�00000000027�12122555434�0024411�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{{ content.text|safe }}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/rss/��������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021055�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/rss/content.html��������������������������������������������0000664�0000000�0000000�00000000354�12122555434�0023417�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% if feed_link %}<h2><a href="{{ feed_link }}">{{ feed_title }}</a></h2> {% else %}<h2>{{ feed_title }}</h2> {% endif %} <ul> {% for entry in entries %} <li><a href="{{ entry.link }}">{{ entry.title }}</a></li> {% endfor %} </ul> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/section/����������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021712�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/section/default.html����������������������������������������0000664�0000000�0000000�00000000202�12122555434�0024216�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<h2>{{ content.title }}</h2> <a href="{{ content.mediafile.file.url }}">{{ content.mediafile }}</a> {{ content.richtext|safe }} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/section/image.html������������������������������������������0000664�0000000�0000000�00000000161�12122555434�0023660�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<h2>{{ content.title }}</h2> <img src="{{ content.mediafile.file.url }}" alt="" /> {{ content.richtext|safe }} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/video/������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0021354�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/video/sf.html�����������������������������������������������0000664�0000000�0000000�00000000576�12122555434�0022662�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<object data="http://www.sf.tv/videoplayer/embed/2a8583e0-91ac-4451-b3af-d63fbc0c0042" type="application/x-shockwave-flash" style="width:640px;height:386px"> <param name="movie" value="http://www.sf.tv/videoplayer/embed/2a8583e0-91ac-4451-b3af-d63fbc0c0042"/> <param name="quality" value="high" /> <param name="allowFullScreen" value="true" /> </object> ����������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/video/unknown.html������������������������������������������0000664�0000000�0000000�00000000066�12122555434�0023743�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<a href="{{ content.video }}">{{ content.video }}</a> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/video/vimeo.html��������������������������������������������0000664�0000000�0000000�00000000234�12122555434�0023360�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<iframe src="//player.vimeo.com/video/{{ id }}" width="650" height="365" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templates/content/video/youtube.html������������������������������������������0000664�0000000�0000000�00000000626�12122555434�0023742�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<object width="425" height="344"> <param name="movie" value="//www.youtube.com/v/{{ v }}&hl=en&fs=1&"></param> <param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param> <embed src="//www.youtube.com/v/{{ v }}&hl=en&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed> </object> ����������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templatetags/�����������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0017270�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templatetags/__init__.py������������������������������������������������������0000664�0000000�0000000�00000000000�12122555434�0021367�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templatetags/applicationcontent_tags.py���������������������������������������0000664�0000000�0000000�00000010325�12122555434�0024557�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django import template from django.core.urlresolvers import NoReverseMatch from django.template import TemplateSyntaxError from django.template.defaulttags import kwarg_re from django.utils.encoding import smart_str # backwards compatibility import from feincms.templatetags.fragment_tags import fragment, get_fragment, has_fragment register = template.Library() register.tag(fragment) register.tag(get_fragment) register.filter(has_fragment) @register.simple_tag def feincms_render_region_appcontent(page, region, request): """Render only the application content for the region This allows template authors to choose whether their page behaves differently when displaying embedded application subpages by doing something like this:: {% if not in_appcontent_subpage %} {% feincms_render_region feincms_page "main" request %} {% else %} {% feincms_render_region_appcontent feincms_page "main" request %} {% endif %} """ from feincms.content.application.models import ApplicationContent from feincms.templatetags.feincms_tags import _render_content return u''.join(_render_content(content, request=request) for content in\ page.content.all_of_type(ApplicationContent) if content.region == region) class AppReverseNode(template.Node): def __init__(self, view_name, urlconf, args, kwargs, asvar): self.view_name = view_name self.urlconf = urlconf self.args = args self.kwargs = kwargs self.asvar = asvar def render(self, context): from feincms.content.application.models import app_reverse args = [arg.resolve(context) for arg in self.args] kwargs = dict([(smart_str(k, 'ascii'), v.resolve(context)) for k, v in self.kwargs.items()]) view_name = self.view_name.resolve(context) urlconf = self.urlconf.resolve(context) try: url = app_reverse(view_name, urlconf, args=args, kwargs=kwargs, current_app=context.current_app) except NoReverseMatch: if self.asvar is None: raise url = '' if self.asvar: context[self.asvar] = url return u'' else: return url @register.tag def app_reverse(parser, token): """ Returns an absolute URL for applications integrated with ApplicationContent The tag mostly works the same way as Django's own {% url %} tag:: {% load applicationcontent_tags %} {% app_reverse "mymodel_detail" "myapp.urls" arg1 arg2 %} or {% load applicationcontent_tags %} {% app_reverse "mymodel_detail" "myapp.urls" name1=value1 name2=value2 %} The first argument is a path to a view. The second argument is the URLconf under which this app is known to the ApplicationContent. The second argument may also be a request object if you want to reverse an URL belonging to the current application content. Other arguments are space-separated values that will be filled in place of positional and keyword arguments in the URL. Don't mix positional and keyword arguments. If you want to store the URL in a variable instead of showing it right away you can do so too:: {% app_reverse "mymodel_detail" "myapp.urls" arg1 arg2 as url %} """ bits = token.split_contents() if len(bits) < 3: raise TemplateSyntaxError("'%s' takes at least two arguments" " (path to a view and a urlconf)" % bits[0]) viewname = parser.compile_filter(bits[1]) urlconf = parser.compile_filter(bits[2]) args = [] kwargs = {} asvar = None bits = bits[3:] if len(bits) >= 2 and bits[-2] == 'as': asvar = bits[-1] bits = bits[:-2] if len(bits): for bit in bits: match = kwarg_re.match(bit) if not match: raise TemplateSyntaxError("Malformed arguments to app_reverse tag") name, value = match.groups() if name: kwargs[name] = parser.compile_filter(value) else: args.append(parser.compile_filter(value)) return AppReverseNode(viewname, urlconf, args, kwargs, asvar) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templatetags/feincms_admin_tags.py��������������������������������������������0000664�0000000�0000000�00000002473�12122555434�0023462�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django import template register = template.Library() @register.filter def post_process_fieldsets(fieldset): """ Removes a few fields from FeinCMS admin inlines, those being ``id``, ``DELETE`` and ``ORDER`` currently. Additionally, it ensures that dynamically added fields (i.e. ``ApplicationContent``'s ``admin_fields`` option) are shown. """ # abort if fieldset is customized if fieldset.model_admin.fieldsets: return fieldset fields_to_include = set(fieldset.form.fields.keys()) for f in ('id', 'DELETE', 'ORDER'): fields_to_include.discard(f) def _filter_recursive(fields): ret = [] for f in fields: if hasattr(f, '__iter__'): # Several fields on one line sub = _filter_recursive(f) # Only add if there's at least one field left if sub: ret.append(sub) elif f in fields_to_include: ret.append(f) fields_to_include.discard(f) return ret new_fields = _filter_recursive(fieldset.fields) # Add all other fields (ApplicationContent's admin_fields) to # the end of the fieldset for f in fields_to_include: new_fields.append(f) fieldset.fields = new_fields return fieldset �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templatetags/feincms_tags.py��������������������������������������������������0000664�0000000�0000000�00000005543�12122555434�0022313�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ import logging from django import template from django.template.loader import render_to_string register = template.Library() def _render_content(content, **kwargs): # Track current render level and abort if we nest too deep. Avoids # crashing in recursive page contents (eg. a page list that contains # itself or similar). request = kwargs.get('request') if request is not None: level = getattr(request, 'feincms_render_level', 0) if level > 10: logging.getLogger('feincms').error( 'Refusing to render %r, render level is already %s' % ( content, level)) return setattr(request, 'feincms_render_level', level + 1) if (request and request.COOKIES.get('frontend_editing', False) and\ hasattr(content, 'fe_render')): r = content.fe_render(**kwargs) else: r = content.render(**kwargs) if request is not None: level = getattr(request, 'feincms_render_level', 1) setattr(request, 'feincms_render_level', max(level - 1, 0)) return r @register.simple_tag(takes_context=True) def feincms_render_region(context, feincms_object, region, request): """ {% feincms_render_region feincms_page "main" request %} """ return u''.join(_render_content(content, request=request, context=context) for content in getattr(feincms_object.content, region)) @register.simple_tag(takes_context=True) def feincms_render_content(context, content, request): """ {% feincms_render_content content request %} """ return _render_content(content, request=request, context=context) @register.simple_tag def feincms_frontend_editing(cms_obj, request): """ {% feincms_frontend_editing feincms_page request %} """ if hasattr(request, 'COOKIES') and request.COOKIES.get('frontend_editing') == 'True': context = template.RequestContext(request, { "feincms_page": cms_obj, }) return render_to_string('admin/feincms/fe_tools.html', context) return u'' @register.inclusion_tag('admin/feincms/content_type_selection_widget.html', takes_context=True) def show_content_type_selection_widget(context, region): """ {% show_content_type_selection_widget region %} """ grouped = {} ungrouped = [] for ct in region._content_types: ct_info = (ct.__name__.lower(), ct._meta.verbose_name) if hasattr(ct, 'optgroup'): if ct.optgroup in grouped: grouped[ct.optgroup].append(ct_info) else: grouped[ct.optgroup] = [ct_info] else: ungrouped.append(ct_info) return {'grouped': grouped, 'ungrouped': ungrouped} �������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templatetags/feincms_thumbnail.py���������������������������������������������0000664�0000000�0000000�00000015270�12122555434�0023336�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ import re from cStringIO import StringIO # Try to import PIL in either of the two ways it can end up installed. try: from PIL import Image except ImportError: try: import Image except ImportError: # Django seems to silently swallow the ImportError under certain # circumstances. Raise a generic exception explaining why we are # unable to proceed. raise Exception, 'FeinCMS requires PIL to be installed' from django import template from django.utils.encoding import force_unicode from django.core.files.storage import default_storage from django.core.files.base import ContentFile from feincms import settings register = template.Library() class Thumbnailer(object): THUMBNAIL_SIZE_RE = re.compile(r'^(?P<w>\d+)x(?P<h>\d+)$') MARKER = '_thumb_' def __init__(self, filename, size='200x200'): self.filename = filename self.size = size @property def url(self): return unicode(self) def __unicode__(self): match = self.THUMBNAIL_SIZE_RE.match(self.size) if not (self.filename and match): return u'' matches = match.groupdict() # figure out storage if hasattr(self.filename, 'storage'): storage = self.filename.storage else: storage = default_storage # figure out name if hasattr(self.filename, 'name'): filename = self.filename.name else: filename = force_unicode(self.filename) # defining the filename and the miniature filename try: basename, format = filename.rsplit('.', 1) except ValueError: basename, format = filename, 'jpg' miniature = u''.join([ settings.FEINCMS_THUMBNAIL_DIR, basename, self.MARKER, self.size, '.', format, ]) if not storage.exists(miniature): generate = True else: try: generate = storage.modified_time(miniature) < storage.modified_time(filename) except (NotImplementedError, AttributeError): # storage does NOT support modified_time generate = False except (OSError, IOError): # Someone might have delete the file return u'' if generate: return self.generate( storage=storage, original=filename, size=matches, miniature=miniature) return storage.url(miniature) def generate(self, storage, original, size, miniature): try: image = Image.open(StringIO(storage.open(original).read())) # defining the size w, h = int(size['w']), int(size['h']) format = image.format # Save format for the save() call later image.thumbnail([w, h], Image.ANTIALIAS) buf = StringIO() if image.mode not in ('RGBA', 'RGB', 'L'): image = image.convert('RGBA') image.save(buf, format or 'jpeg', quality=80) raw_data = buf.getvalue() buf.close() storage.delete(miniature) storage.save(miniature, ContentFile(raw_data)) return storage.url(miniature) except: # PIL raises a plethora of Exceptions if reading the image # is not possible. Since we cannot be sure what Exception will # happen, catch them all so the thumbnailer will never fail. return storage.url(original) class CropscaleThumbnailer(Thumbnailer): THUMBNAIL_SIZE_RE = re.compile(r'^(?P<w>\d+)x(?P<h>\d+)(-(?P<x>\d+)x(?P<y>\d+))?$') MARKER = '_cropscale_' def generate(self, storage, original, size, miniature): try: image = Image.open(StringIO(storage.open(original).read())) except: # PIL raises a plethora of Exceptions if reading the image # is not possible. Since we cannot be sure what Exception will # happen, catch them all so the thumbnailer will never fail. return storage.url(original) storage.delete(miniature) w, h = int(size['w']), int(size['h']) if size['x'] and size['y']: x, y = int(size['x']), int(size['y']) else: x, y = 50, 50 src_width, src_height = image.size src_ratio = float(src_width) / float(src_height) dst_width, dst_height = w, h dst_ratio = float(dst_width) / float(dst_height) if dst_ratio < src_ratio: crop_height = src_height crop_width = crop_height * dst_ratio x_offset = int(float(src_width - crop_width) * x / 100) y_offset = 0 else: crop_width = src_width crop_height = crop_width / dst_ratio x_offset = 0 y_offset = int(float(src_height - crop_height) * y / 100) format = image.format # Save format for the save() call later image = image.crop((x_offset, y_offset, x_offset+int(crop_width), y_offset+int(crop_height))) image = image.resize((dst_width, dst_height), Image.ANTIALIAS) buf = StringIO() if image.mode not in ('RGBA', 'RGB', 'L'): image = image.convert('RGBA') image.save(buf, format or 'jpeg', quality=100) raw_data = buf.getvalue() buf.close() storage.save(miniature, ContentFile(raw_data)) return storage.url(miniature) @register.filter def thumbnail(filename, size='200x200'): """ Creates a thumbnail from the image passed, returning its path:: {{ object.image|thumbnail:"400x300" }} OR {{ object.image.name|thumbnail:"400x300" }} You can pass either an ``ImageField``, ``FileField`` or the ``name`` but not the ``url`` attribute of an ``ImageField`` or ``FileField``. The dimensions passed are treated as a bounding box. The aspect ratio of the initial image is preserved. Images aren't blown up in size if they are already smaller. Both width and height must be specified. If you do not care about one of them, just set it to an arbitrarily large number:: {{ object.image|thumbnail:"300x999999" }} """ return Thumbnailer(filename, size) @register.filter def cropscale(filename, size='200x200'): """ Scales the image down and crops it so that its size equals exactly the size passed (as long as the initial image is bigger than the specification). """ return CropscaleThumbnailer(filename, size) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/templatetags/fragment_tags.py�������������������������������������������������0000664�0000000�0000000�00000005620�12122555434�0022466�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django import template register = template.Library() class FragmentNode(template.Node): def __init__(self, nodelist, request, identifier, mode='append'): self.nodelist = nodelist self.request_var = template.Variable(request) self.identifier_var = template.Variable(identifier) self.mode = mode def render(self, context): request = self.request_var.resolve(context) identifier = self.identifier_var.resolve(context) rendered = self.nodelist.render(context) if not hasattr(request, '_feincms_fragments'): request._feincms_fragments = {} old = request._feincms_fragments.get(identifier, u'') if self.mode == 'prepend': request._feincms_fragments[identifier] = rendered + old elif self.mode == 'replace': request._feincms_fragments[identifier] = rendered else: # append request._feincms_fragments[identifier] = old + rendered return u'' @register.tag def fragment(parser, token): """ Appends the given content to the fragment. Different modes (replace, append) are available if specified. Either:: {% fragment request "title" %} content ... {% endfragment %} or:: {% fragment request "title" (prepend|replace|append) %} content ... {% endfragment %} """ nodelist = parser.parse(('endfragment'),) parser.delete_first_token() return FragmentNode(nodelist, *token.contents.split()[1:]) class GetFragmentNode(template.Node): def __init__(self, request, fragment, as_var=None): self.request = template.Variable(request) self.fragment = template.Variable(fragment) self.as_var = as_var def render(self, context): request = self.request.resolve(context) fragment = self.fragment.resolve(context) try: value = request._feincms_fragments[fragment] except (AttributeError, KeyError): value = u'' if self.as_var: context[self.as_var] = value return u'' return value @register.tag def get_fragment(parser, token): """ Fetches the content of a fragment. Either:: {% get_fragment request "title" %} or:: {% get_fragment request "title" as title %} """ fragments = token.contents.split() if len(fragments) == 3: return GetFragmentNode(fragments[1], fragments[2]) elif len(fragments) == 5 and fragments[3] == 'as': return GetFragmentNode(fragments[1], fragments[2], fragments[4]) raise template.TemplateSyntaxError, 'Invalid syntax for get_fragment: %s' % token.contents @register.filter def has_fragment(request, identifier): """ Returns the content of the fragment, despite its name:: {% if request|has_fragment:"title" %} ... {% endif %} """ return getattr(request, '_feincms_fragments', {}).get(identifier) ����������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/tests/������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0015740�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/tests/__init__.py�������������������������������������������������������������0000664�0000000�0000000�00000000641�12122555434�0020052�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import import os if os.environ.get('FEINCMS_RUN_TESTS'): from .cms_tests import * from .page_tests import * from .tests import * # ------------------------------------------------------------------------ �����������������������������������������������������������������������������������������������feincms-1.7.4/feincms/tests/cms_tests.py������������������������������������������������������������0000664�0000000�0000000�00000014612�12122555434�0020322�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import from django.core.exceptions import ImproperlyConfigured from django.db import models from django.test import TestCase from feincms.content.contactform.models import ContactFormContent from feincms.content.file.models import FileContent from feincms.content.image.models import ImageContent from feincms.content.raw.models import RawContent from feincms.content.richtext.models import RichTextContent from feincms.content.video.models import VideoContent from .tests import ExampleCMSBase, Empty, ExampleCMSBase2 # ------------------------------------------------------------------------ class SubRawContent(RawContent): title = models.CharField('title', max_length=100, blank=True) class Meta: abstract = True class CMSBaseTest(TestCase): def test_01_simple_content_type_creation(self): self.assertEqual(ExampleCMSBase.content_type_for(FileContent), None) ExampleCMSBase.create_content_type(ContactFormContent) ExampleCMSBase.create_content_type(FileContent, regions=('region2',)) ExampleCMSBase.create_content_type(RawContent) ExampleCMSBase.create_content_type(RichTextContent) # test creating a cotent with arguments, but no initialize_type classmethod ExampleCMSBase.create_content_type(VideoContent, arbitrary_arg='arbitrary_value') # content_type_for should return None if it does not have a subclass registered self.assertEqual(ExampleCMSBase.content_type_for(Empty), None) self.assertTrue('filecontent' not in dict(ExampleCMSBase.template.regions[0].content_types).keys()) self.assertTrue('filecontent' in dict(ExampleCMSBase.template.regions[1].content_types).keys()) def test_02_rsscontent_creation(self): # this test resides in its own method because the required feedparser # module is not available everywhere from feincms.content.rss.models import RSSContent type = ExampleCMSBase.create_content_type(RSSContent) obj = type() self.assertTrue('yahoo' not in obj.render()) obj.link = 'http://rss.news.yahoo.com/rss/topstories' obj.cache_content(save=False) self.assertTrue('yahoo' in obj.render()) #Creating a content type twice isn't forbidden anymore #def test_03_double_creation(self): # # creating a content type twice is forbidden # self.assertRaises(ImproperlyConfigured, # lambda: ExampleCMSBase.create_content_type(RawContent)) def test_04_mediafilecontent_creation(self): # the medialibrary needs to be enabled, otherwise this test fails from feincms.content.medialibrary.models import MediaFileContent # no TYPE_CHOICES, should raise self.assertRaises(ImproperlyConfigured, lambda: ExampleCMSBase.create_content_type(MediaFileContent)) def test_05_non_abstract_content_type(self): # Should not be able to create a content type from a non-abstract base type class TestContentType(models.Model): pass self.assertRaises(ImproperlyConfigured, lambda: ExampleCMSBase.create_content_type(TestContentType)) def test_06_videocontent(self): type = ExampleCMSBase.content_type_for(VideoContent) obj = type() obj.video = 'http://www.youtube.com/watch?v=zmj1rpzDRZ0' self.assertTrue('x-shockwave-flash' in obj.render()) self.assertEqual(getattr(type, 'arbitrary_arg'), 'arbitrary_value') obj.video = 'http://www.example.com/' self.assertTrue(obj.video in obj.render()) def test_07_default_render_method(self): class SomethingElse(models.Model): class Meta: abstract = True def render_region(self): return 'hello' type = ExampleCMSBase.create_content_type(SomethingElse) obj = type() self.assertRaises(NotImplementedError, lambda: obj.render()) obj.region = 'region' self.assertEqual(obj.render(), 'hello') def test_08_creating_two_content_types_in_same_application(self): ExampleCMSBase.create_content_type(RawContent) ct = ExampleCMSBase.content_type_for(RawContent) self.assertEqual(ct._meta.db_table, 'tests_examplecmsbase_rawcontent') ExampleCMSBase2.create_content_type(RawContent, class_name='RawContent2') ct2 = ExampleCMSBase2.content_type_for(RawContent) self.assertEqual(ct2._meta.db_table, 'tests_examplecmsbase2_rawcontent2') def test_09_related_objects_cache(self): """ We need to define a model with relationship to our Base *after* all content types have been registered; previously _fill_*_cache methods were called during each content type registration, so any new related objects added after the last content type time missed the boat. Now we delete the cache so hopefully _fill_*_cache* won't be called until all related models have been defined. """ class Attachment(models.Model): base = models.ForeignKey(ExampleCMSBase, related_name='test_related_name') # See issue #323 on Github. ExampleCMSBase._meta._fill_related_objects_cache() related_models = map( lambda x: x.model, ExampleCMSBase._meta.get_all_related_objects()) self.assertTrue(Attachment in related_models) self.assertTrue(hasattr(ExampleCMSBase, 'test_related_name')) #self.assertFalse(hasattr(Attachment, 'anycontents')) class AnyContent(models.Model): attachment = models.ForeignKey(Attachment, related_name='anycontents') class Meta: abstract = True ct = ExampleCMSBase.create_content_type(AnyContent) self.assertTrue(hasattr(ExampleCMSBase, 'test_related_name')) self.assertTrue(hasattr(Attachment, 'anycontents')) def test_10_content_type_subclasses(self): """ See: https://github.com/feincms/feincms/issues/339 """ ExampleCMSBase.create_content_type(SubRawContent) ExampleCMSBase.create_content_type(RawContent) ct = ExampleCMSBase.content_type_for(RawContent) ct2 = ExampleCMSBase.content_type_for(SubRawContent) self.assertNotEqual(ct, ct2) ����������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/tests/page_tests.py�����������������������������������������������������������0000664�0000000�0000000�00000164056�12122555434�0020464�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from __future__ import absolute_import from datetime import datetime, timedelta import os import re from django import forms, template from django.conf import settings from django.contrib.auth.models import User, AnonymousUser from django.contrib.contenttypes.models import ContentType from django.core import mail from django.core.urlresolvers import reverse from django.db import models from django.contrib.sites.models import Site from django.http import Http404, HttpResponseBadRequest from django.template import TemplateDoesNotExist from django.template.defaultfilters import slugify from django.test import TestCase from django.utils import timezone from feincms import settings as feincms_settings from feincms.content.application.models import _empty_reverse_cache, app_reverse from feincms.content.image.models import ImageContent from feincms.content.raw.models import RawContent from feincms.content.richtext.models import RichTextContent from feincms.context_processors import add_page_if_missing from feincms.models import ContentProxy from feincms.module.medialibrary.models import Category, MediaFile from feincms.module.page import processors from feincms.module.page.models import Page from feincms.templatetags import feincms_tags from feincms.translations import short_language_code from .tests import Empty # ------------------------------------------------------------------------ class PagesTestCase(TestCase): def setUp(self): u = User(username='test', is_active=True, is_staff=True, is_superuser=True) u.set_password('test') u.save() self.site_1 = Site.objects.all()[0] Page.register_templates({ 'key': 'base', 'title': 'Standard template', 'path': 'feincms_base.html', 'regions': ( ('main', 'Main content area'), ('sidebar', 'Sidebar', 'inherited'), ), }, { 'key': 'theother', 'title': 'This actually exists', 'path': 'base.html', 'regions': ( ('main', 'Main content area'), ('sidebar', 'Sidebar', 'inherited'), ), }) def login(self): self.assertTrue(self.client.login(username='test', password='test')) def create_page(self, title='Test page', parent='', **kwargs): dic = { 'title': title, 'slug': kwargs.get('slug', slugify(title)), 'parent': parent, 'template_key': 'base', 'publication_date_0': '2009-01-01', 'publication_date_1': '00:00:00', 'initial-publication_date_0': '2009-01-01', 'initial-publication_date_1': '00:00:00', 'language': 'en', 'site': self.site_1.id, 'rawcontent_set-TOTAL_FORMS': 0, 'rawcontent_set-INITIAL_FORMS': 0, 'rawcontent_set-MAX_NUM_FORMS': 10, 'mediafilecontent_set-TOTAL_FORMS': 0, 'mediafilecontent_set-INITIAL_FORMS': 0, 'mediafilecontent_set-MAX_NUM_FORMS': 10, 'imagecontent_set-TOTAL_FORMS': 0, 'imagecontent_set-INITIAL_FORMS': 0, 'imagecontent_set-MAX_NUM_FORMS': 10, 'contactformcontent_set-TOTAL_FORMS': 0, 'contactformcontent_set-INITIAL_FORMS': 0, 'contactformcontent_set-MAX_NUM_FORMS': 10, 'filecontent_set-TOTAL_FORMS': 0, 'filecontent_set-INITIAL_FORMS': 0, 'filecontent_set-MAX_NUM_FORMS': 10, 'applicationcontent_set-TOTAL_FORMS': 0, 'applicationcontent_set-INITIAL_FORMS': 0, 'applicationcontent_set-MAX_NUM_FORMS': 10, } dic.update(kwargs) return self.client.post('/admin/page/page/add/', dic) def create_default_page_set(self): self.login() self.create_page() return self.create_page('Test child page', 1) def is_published(self, url, should_be=True): try: self.client.get(url) except TemplateDoesNotExist, e: if should_be: if e.args != ('feincms_base.html',): raise else: if e.args != ('404.html',): raise def test_01_tree_editor(self): self.login() self.assertEqual(self.client.get('/admin/page/page/').status_code, 200) self.assertRedirects(self.client.get('/admin/page/page/?anything=anything'), '/admin/page/page/?e=1') def test_02_add_page(self): self.login() self.assertRedirects(self.create_page(title='Test page ' * 10, slug='test-page'), '/admin/page/page/') self.assertEqual(Page.objects.count(), 1) self.assertContains(self.client.get('/admin/page/page/'), u'…') def test_03_item_editor(self): self.login() self.assertRedirects(self.create_page(_continue=1), '/admin/page/page/1/') self.assertEqual(self.client.get('/admin/page/page/1/').status_code, 200) self.is_published('/admin/page/page/42/', should_be=False) def test_03_add_another(self): self.login() self.assertRedirects(self.create_page(_addanother=1), '/admin/page/page/add/') def test_04_add_child(self): response = self.create_default_page_set() self.assertRedirects(response, '/admin/page/page/') self.assertEqual(Page.objects.count(), 2) page = Page.objects.get(pk=2) self.assertEqual(page.get_absolute_url(), '/test-page/test-child-page/') page.active = True page.in_navigation = True page.save() # page2 inherited the inactive flag from the toplevel page self.assertContains(self.client.get('/admin/page/page/'), 'inherited') page1 = Page.objects.get(pk=1) page1.active = True page1.save() self.assertEqual(len(self.client.get('/admin/page/page/').content.split('checked="checked"')), 4) def test_05_override_url(self): self.create_default_page_set() page = Page.objects.get(pk=1) page.override_url = '/something/' page.save() page2 = Page.objects.get(pk=2) self.assertEqual(page2.get_absolute_url(), '/something/test-child-page/') page.override_url = '/' page.save() page2 = Page.objects.get(pk=2) self.assertEqual(page2.get_absolute_url(), '/test-child-page/') # This goes through feincms.views.base.handler instead of the applicationcontent handler self.is_published('/', False) page.active = True page.template_key = 'theother' page.save() self.is_published('/', True) def test_06_tree_editor_save(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) page2 = Page.objects.get(pk=2) page3 = Page.objects.create(title='page3', slug='page3', parent=page2) page4 = Page.objects.create(title='page4', slug='page4', parent=page1) page5 = Page.objects.create(title='page5', slug='page5', parent=None) self.assertEqual(page3.get_absolute_url(), '/test-page/test-child-page/page3/') self.assertEqual(page4.get_absolute_url(), '/test-page/page4/') self.assertEqual(page5.get_absolute_url(), '/page5/') self.client.post('/admin/page/page/', { '__cmd': 'move_node', 'position': 'last-child', 'cut_item': '1', 'pasted_on': '5', }, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(Page.objects.get(pk=1).get_absolute_url(), '/page5/test-page/') self.assertEqual(Page.objects.get(pk=5).get_absolute_url(), '/page5/') self.assertEqual(Page.objects.get(pk=3).get_absolute_url(), '/page5/test-page/test-child-page/page3/') def test_07_tree_editor_toggle_boolean(self): self.create_default_page_set() self.assertEqual(Page.objects.get(pk=1).in_navigation, False) self.assertContains(self.client.post('/admin/page/page/', { '__cmd': 'toggle_boolean', 'item_id': 1, 'attr': 'in_navigation', }, HTTP_X_REQUESTED_WITH='XMLHttpRequest'), r'checked=\"checked\"') self.assertEqual(Page.objects.get(pk=1).in_navigation, True) self.assertNotContains(self.client.post('/admin/page/page/', { '__cmd': 'toggle_boolean', 'item_id': 1, 'attr': 'in_navigation', }, HTTP_X_REQUESTED_WITH='XMLHttpRequest'), 'checked="checked"') self.assertEqual(Page.objects.get(pk=1).in_navigation, False) self.assertTrue(isinstance(self.client.post('/admin/page/page/', { '__cmd': 'toggle_boolean', 'item_id': 1, 'attr': 'notexists', }, HTTP_X_REQUESTED_WITH='XMLHttpRequest'), HttpResponseBadRequest)) def test_07_tree_editor_invalid_ajax(self): self.login() self.assertContains(self.client.post('/admin/page/page/', { '__cmd': 'notexists', }, HTTP_X_REQUESTED_WITH='XMLHttpRequest'), 'Oops. AJAX request not understood.', status_code=400) def test_08_publishing(self): self.create_default_page_set() page = Page.objects.get(pk=1) page2 = Page.objects.get(pk=2) self.is_published(page.get_absolute_url(), should_be=False) self.is_published(page2.get_absolute_url(), should_be=False) page.active = True page.save() page2.active = True page2.save() self.is_published(page.get_absolute_url(), should_be=True) self.is_published(page2.get_absolute_url(), should_be=True) old_publication = page.publication_date page.publication_date = timezone.now() + timedelta(days=1) page.save() self.is_published(page.get_absolute_url(), should_be=False) # Should be not accessible because of its parent's inactivity self.is_published(page2.get_absolute_url(), should_be=False) page.publication_date = old_publication page.publication_end_date = timezone.now() - timedelta(days=1) page.save() self.is_published(page.get_absolute_url(), should_be=False) # Should be not accessible because of its parent's inactivity self.is_published(page2.get_absolute_url(), should_be=False) page.publication_end_date = timezone.now() + timedelta(days=1) page.save() self.is_published(page.get_absolute_url(), should_be=True) self.is_published(page2.get_absolute_url(), should_be=True) def create_pagecontent(self, page, **kwargs): data = { 'title': page.title, 'slug': page.slug, #'parent': page.parent_id, # this field is excluded from the form 'template_key': page.template_key, 'publication_date_0': '2009-01-01', 'publication_date_1': '00:00:00', 'initial-publication_date_0': '2009-01-01', 'initial-publication_date_1': '00:00:00', 'language': 'en', 'site': self.site_1.id, 'rawcontent_set-TOTAL_FORMS': 1, 'rawcontent_set-INITIAL_FORMS': 0, 'rawcontent_set-MAX_NUM_FORMS': 10, 'rawcontent_set-0-parent': 1, 'rawcontent_set-0-region': 'main', 'rawcontent_set-0-ordering': 0, 'rawcontent_set-0-text': 'This is some example content', 'mediafilecontent_set-TOTAL_FORMS': 1, 'mediafilecontent_set-INITIAL_FORMS': 0, 'mediafilecontent_set-MAX_NUM_FORMS': 10, 'mediafilecontent_set-0-parent': 1, 'mediafilecontent_set-0-type': 'default', 'imagecontent_set-TOTAL_FORMS': 1, 'imagecontent_set-INITIAL_FORMS': 0, 'imagecontent_set-MAX_NUM_FORMS': 10, 'imagecontent_set-0-parent': 1, 'imagecontent_set-0-position': 'default', 'contactformcontent_set-TOTAL_FORMS': 1, 'contactformcontent_set-INITIAL_FORMS': 0, 'contactformcontent_set-MAX_NUM_FORMS': 10, 'filecontent_set-TOTAL_FORMS': 1, 'filecontent_set-INITIAL_FORMS': 0, 'filecontent_set-MAX_NUM_FORMS': 10, 'applicationcontent_set-TOTAL_FORMS': 1, 'applicationcontent_set-INITIAL_FORMS': 0, 'applicationcontent_set-MAX_NUM_FORMS': 10, } data.update(kwargs) return self.client.post('/admin/page/page/%s/' % page.pk, data) def test_09_pagecontent(self): self.create_default_page_set() page = Page.objects.get(pk=1) response = self.create_pagecontent(page) self.assertRedirects(response, '/admin/page/page/') self.assertEqual(page.content.main[0].__class__.__name__, 'RawContent') page2 = Page.objects.get(pk=2) page2.symlinked_page = page # Test that all_of_type works correctly even before accessing # other content methods self.assertEqual(len(page2.content.all_of_type(RawContent)), 1) self.assertEqual(page2.content.main[0].__class__.__name__, 'RawContent') self.assertEqual(unicode(page2.content.main[0]), 'main on Test page, ordering 0') self.assertEqual(len(page2.content.main), 1) self.assertEqual(len(page2.content.sidebar), 0) self.assertEqual(len(page2.content.nonexistant_region), 0) self.assertTrue(isinstance(page2.content.media, forms.Media)) self.assertEqual(len(page2.content.all_of_type(RawContent)), 1) self.assertEqual(len(page2.content.all_of_type((ImageContent,))), 0) self.assertEqual(len(page2.content.all_of_type([ImageContent])), 0) def test_10_mediafile_and_imagecontent(self): self.create_default_page_set() page = Page.objects.get(pk=1) self.create_pagecontent(page) category = Category.objects.create(title='Category', parent=None) category2 = Category.objects.create(title='Something', parent=category) self.assertEqual(unicode(category2), 'Category - Something') self.assertEqual(unicode(category), 'Category') mediafile = MediaFile.objects.create(file='somefile.jpg') mediafile.categories = [category] page.mediafilecontent_set.create( mediafile=mediafile, region='main', type='default', ordering=1) self.assertEqual(unicode(mediafile), 'somefile.jpg') mediafile.translations.create(caption='something', language_code='%s-ha' % short_language_code()) mediafile.purge_translation_cache() self.assertTrue('something' in unicode(mediafile)) mf = page.content.main[1].mediafile self.assertEqual(mf.translation.caption, 'something') self.assertEqual(mf.translation.short_language_code(), short_language_code()) self.assertNotEqual(mf.get_absolute_url(), '') self.assertEqual(unicode(mf), 'something') self.assertTrue(mf.type == 'image') self.assertEqual(MediaFile.objects.only_language('de').count(), 0) self.assertEqual(MediaFile.objects.only_language('en').count(), 0) self.assertEqual(MediaFile.objects.only_language('%s-ha' % short_language_code()).count(), 1) self.assertTrue('%s-ha' % short_language_code() in mf.available_translations) # this should not raise self.client.get('/admin/page/page/1/') #self.assertTrue('alt="something"' in page.content.main[1].render()) Since it isn't an image page.imagecontent_set.create(image='somefile.jpg', region='main', position='default', ordering=2) page.filecontent_set.create(file='somefile.jpg', title='thetitle', region='main', ordering=3) # Reload page, reset _ct_inventory page = Page.objects.get(pk=page.pk) page._ct_inventory = None self.assertTrue('somefile.jpg' in page.content.main[2].render()) self.assertTrue(re.search('<a .*href="somefile\.jpg">.*thetitle.*</a>', page.content.main[3].render(), re.MULTILINE + re.DOTALL) is not None) page.mediafilecontent_set.update(mediafile=3) # this should not raise self.client.get('/admin/page/page/1/') field = MediaFile._meta.get_field('file') old = (field.upload_to, field.storage, field.generate_filename) from django.core.files.storage import FileSystemStorage MediaFile.reconfigure(upload_to=lambda: 'anywhere', storage=FileSystemStorage(location='/wha/', base_url='/whe/')) mediafile = MediaFile.objects.get(pk=1) self.assertEqual(mediafile.file.url, '/whe/somefile.jpg') # restore settings (field.upload_to, field.storage, field.generate_filename) = old mediafile = MediaFile.objects.get(pk=1) self.assertEqual(mediafile.file.url, 'somefile.jpg') def test_11_translations(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) self.assertEqual(len(page1.available_translations()), 0) page1 = Page.objects.get(pk=1) page2 = Page.objects.get(pk=2) page2.language = 'de' page2.save() self.assertEqual(len(page2.available_translations()), 0) page2.translation_of = page1 page2.save() self.assertEqual(len(page2.available_translations()), 1) self.assertEqual(len(page1.available_translations()), 1) self.assertEqual(page1, page1.original_translation) self.assertEqual(page1, page2.original_translation) def test_12_titles(self): self.create_default_page_set() page = Page.objects.get(pk=1) self.assertEqual(page.page_title, page.title) self.assertEqual(page.content_title, page.title) page._content_title = 'Something\nawful' page._page_title = 'Hello world' page.save() self.assertEqual(page.page_title, 'Hello world') self.assertEqual(page.content_title, 'Something') self.assertEqual(page.content_subtitle, 'awful') page._content_title = 'Only one line' self.assertEqual(page.content_title, 'Only one line') self.assertEqual(page.content_subtitle, '') page._content_title = '' self.assertEqual(page.content_title, page.title) self.assertEqual(page.content_subtitle, '') def test_13_inheritance_and_ct_tracker(self): self.create_default_page_set() page = Page.objects.get(pk=1) page.rawcontent_set.create( region='sidebar', ordering=0, text='Something') page.rawcontent_set.create( region='main', ordering=0, text='Anything') page2 = Page.objects.get(pk=2) page2.rawcontent_set.create( region='main', ordering=0, text='Something else') page2.rawcontent_set.create( region='main', ordering=1, text='Whatever') # Set default, non-caching content proxy page2.content_proxy_class = ContentProxy if hasattr(self, 'assertNumQueries'): # 4 queries: Two to get the content types of page and page2, one to # fetch all ancestor PKs of page2 and one to materialize the RawContent # instances belonging to page's sidebar and page2's main. self.assertNumQueries(4, lambda: [page2.content.main, page2.content.sidebar]) self.assertNumQueries(0, lambda: page2.content.sidebar[0].render()) self.assertEqual(u''.join(c.render() for c in page2.content.main), 'Something elseWhatever') self.assertEqual(page2.content.sidebar[0].render(), 'Something') page2 = Page.objects.get(pk=2) self.assertEqual(page2._ct_inventory, {}) # Prime Django content type cache for ct in Page._feincms_content_types: ContentType.objects.get_for_model(ct) if hasattr(self, 'assertNumQueries'): # 5 queries: Two to get the content types of page and page2, one to # fetch all ancestor PKs of page2 and one to materialize the RawContent # instances belonging to page's sidebar and page2's main and a few # queries to update the pages _ct_inventory attributes: # - one update to update page2 # - one update to clobber the _ct_inventory attribute of all descendants # of page2 self.assertNumQueries(5, lambda: [page2.content.main, page2.content.sidebar]) self.assertNumQueries(0, lambda: page2.content.sidebar[0].render()) self.assertEqual(page2.content.sidebar[0].render(), 'Something') # Reload, again, to test ct_tracker extension page2 = Page.objects.get(pk=2) if hasattr(self, 'assertNumQueries'): self.assertNumQueries(1, lambda: [page2.content.main, page2.content.sidebar]) self.assertNotEqual(page2._ct_inventory, {}) def test_14_richtext(self): # only create the content type to test the item editor # customization hooks tmp = Page._feincms_content_types[:] type = Page.create_content_type(RichTextContent, regions=('notexists',)) Page._feincms_content_types = tmp from django.utils.safestring import SafeData obj = type() obj.text = 'Something' self.assertTrue(isinstance(obj.render(), SafeData)) def test_15_frontend_editing(self): self.create_default_page_set() page = Page.objects.get(pk=1) self.create_pagecontent(page) # this should return a 404 self.is_published('/admin/page/page/10|rawcontent|1/', should_be=False) self.is_published('/admin/page/page/1|rawcontent|10/', should_be=False) self.assertEqual(self.client.get('/admin/page/page/1|rawcontent|1/').status_code, 200) self.assertEqual(self.client.post('/admin/page/page/1|rawcontent|1/', { 'rawcontent-text': 'blablabla', }).status_code, 200) self.assertEqual(page.content.main[0].render(), 'blablabla') self.assertEqual(feincms_tags.feincms_frontend_editing(page, {}), u'') request = Empty() request.COOKIES = {'frontend_editing': "True"} self.assertIn('class="fe_box"', page.content.main[0].fe_render(request=request)) def test_15_b_client_frontend_editing(self): self.create_default_page_set() page = Page.objects.get(pk=1) self.create_pagecontent(page) page.active = True page.template_key = 'theother' page.save() # FEINCMS_FRONTEND_EDITING is False by default response = self.client.get(page.get_absolute_url() + '?frontend_editing=1', follow=True) self.assertNotIn('class="fe_box"', response.content) self.assertNotIn('frontend_editing', self.client.cookies) # manually register request processor # override_settings(FEINCMS_FRONTEND_EDITING=True) wont work here Page.register_request_processor( processors.frontendediting_request_processor, key='frontend_editing') response = self.client.get(page.get_absolute_url() + '?frontend_editing=1', follow=True) self.assertRedirects(response, page.get_absolute_url()) self.assertIn('class="fe_box"', response.content) self.assertIn('frontend_editing', self.client.cookies) # turn off edit on site response = self.client.get(page.get_absolute_url() + '?frontend_editing=0', follow=True) self.assertRedirects(response, page.get_absolute_url()) self.assertNotIn('class="fe_box"', response.content) # anonymous user cannot front edit self.client.logout() response = self.client.get(page.get_absolute_url() + '?frontend_editing=1', follow=True) self.assertRedirects(response, page.get_absolute_url()) self.assertNotIn('class="fe_box"', response.content) # cleanup request processor del Page.request_processors['frontend_editing'] def test_16_template_tags(self): # Directly testing template tags doesn't make any sense since # feincms_render_* do not use simple_tag anymore pass def test_17_page_template_tags(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) page2 = Page.objects.get(pk=2) page2.language = 'de' page2.translation_of = page1 page2.active = True page2.in_navigation = True page2.save() page3 = Page.objects.create(parent=page2, title='page3', slug='page3', language='en', active=True, in_navigation=True, publication_date=datetime(2001, 1, 1), ) # reload these two, their mptt attributes have changed page1 = Page.objects.get(pk=1) page2 = Page.objects.get(pk=2) context = template.Context({'feincms_page': page2, 'page3': page3}) t = template.Template('{% load feincms_page_tags %}{% feincms_parentlink of feincms_page level=1 %}') self.assertEqual(t.render(context), '/test-page/') t = template.Template('{% load feincms_page_tags %}{% feincms_languagelinks for feincms_page as links %}{% for key, name, link in links %}{{ key }}:{{ link }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), 'en:/test-page/,de:/test-page/test-child-page/') t = template.Template('{% load feincms_page_tags %}{% feincms_languagelinks for page3 as links %}{% for key, name, link in links %}{{ key }}:{{ link }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), 'en:/test-page/test-child-page/page3/,de:None') t = template.Template('{% load feincms_page_tags %}{% feincms_languagelinks for page3 as links existing %}{% for key, name, link in links %}{{ key }}:{{ link }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), 'en:/test-page/test-child-page/page3/') t = template.Template('{% load feincms_page_tags %}{% feincms_languagelinks for feincms_page as links excludecurrent=1 %}{% for key, name, link in links %}{{ key }}:{{ link }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), 'en:/test-page/') t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=1 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), '') # XXX should the other template tags not respect the in_navigation setting too? page1.active = True page1.in_navigation = True page1.save() self.assertEqual(t.render(context), '/test-page/') t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), '/test-page/test-child-page/') t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of request as nav level=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') from django.http import HttpRequest request = HttpRequest() request.path = '/test-page/' self.assertEqual(t.render(template.Context({'request': request})), '/test-page/test-child-page/') t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=99 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), '') t = template.Template('{% load feincms_page_tags %}{% feincms_breadcrumbs feincms_page %}') rendered = t.render(context) self.assertTrue("Test child page" in rendered) self.assertTrue('href="/test-page/">Test page</a>' in rendered, msg="The parent page should be a breadcrumb link") self.assertTrue('href="/test-page/test-child-page/"' not in rendered, msg="The current page should not be a link in the breadcrumbs") t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=2,depth=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), '/test-page/test-child-page/,/test-page/test-child-page/page3/') t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=1,depth=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), '/test-page/,/test-page/test-child-page/') t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=1,depth=3 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), '/test-page/,/test-page/test-child-page/,/test-page/test-child-page/page3/') t = template.Template('{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=3,depth=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}') self.assertEqual(t.render(context), '/test-page/test-child-page/page3/') t = template.Template('{% load feincms_page_tags %}{% if feincms_page|is_parent_of:page3 %}yes{% endif %}|{% if page3|is_parent_of:feincms_page %}yes{% endif %}') self.assertEqual(t.render(context), 'yes|') t = template.Template('{% load feincms_page_tags %}{% if feincms_page|is_equal_or_parent_of:page3 %}yes{% endif %}|{% if page3|is_equal_or_parent_of:feincms_page %}yes{% endif %}') self.assertEqual(t.render(context), 'yes|') t = template.Template('{% load feincms_page_tags %}{% feincms_translatedpage for feincms_page as t1 language=de %}{% feincms_translatedpage for feincms_page as t2 %}{{ t1.id }}|{{ t2.id }}') self.assertEqual(t.render(context), '2|1') def test_17_feincms_navigation(self): """ Test feincms_navigation some more """ self.login() self.create_page('Page 1') # 1 self.create_page('Page 1.1', 1) self.create_page('Page 1.2', 1) # 3 self.create_page('Page 1.2.1', 3) self.create_page('Page 1.2.2', 3) self.create_page('Page 1.2.3', 3) self.create_page('Page 1.3', 1) self.create_page('Page 2') # 8 self.create_page('Page 2.1', 8) self.create_page('Page 2.2', 8) self.create_page('Page 2.3', 8) self.create_page('Page 3') # 12 self.create_page('Page 3.1', 12) self.create_page('Page 3.2', 12) self.create_page('Page 3.3', 12) # 15 self.create_page('Page 3.3.1', 15) # 16 self.create_page('Page 3.3.1.1', 16) self.create_page('Page 3.3.2', 15) self.create_page('Page 4') # 19 self.create_page('Page 4.1', 19) self.create_page('Page 4.2', 19) """ Creates the following structure: 1 (1) -+- 1.1 (2) +- 1.2 (3) -+- 1.2.1 (4) | +- 1.2.2 (5) | +- 1.2.3 (6) +- 1.3 (7) 2 (8) -+- 2.1 (9) +- 2.2 (10) +- 2.3 (11) 3 (12) -+- 3.1 (13) +- 3.2 (14) +- 3.3 (15) -+- 3.3.1 (16) --- 3.3.1.1 (17) +- 3.3.2 (18) 4 (19) -+- 4.1 (20) +- 4.2 (21) """ Page.objects.all().update(active=True, in_navigation=True) Page.objects.filter(id__in=(5, 9, 19)).update(in_navigation=False) tests = [ ( {'feincms_page': Page.objects.get(pk=1)}, '{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=1,depth=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-1/,/page-1/page-11/,/page-1/page-12/,/page-1/page-13/,/page-2/,/page-2/page-22/,/page-2/page-23/,/page-3/,/page-3/page-31/,/page-3/page-32/,/page-3/page-33/', ), ( {'feincms_page': Page.objects.get(pk=14)}, '{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=2,depth=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-3/page-31/,/page-3/page-32/,/page-3/page-33/,/page-3/page-33/page-331/,/page-3/page-33/page-332/', ), ( {'feincms_page': Page.objects.get(pk=14)}, '{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=2,depth=3 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-3/page-31/,/page-3/page-32/,/page-3/page-33/,/page-3/page-33/page-331/,/page-3/page-33/page-331/page-3311/,/page-3/page-33/page-332/', ), ( {'feincms_page': Page.objects.get(pk=19)}, '{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=1,depth=2 %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-1/,/page-1/page-11/,/page-1/page-12/,/page-1/page-13/,/page-2/,/page-2/page-22/,/page-2/page-23/,/page-3/,/page-3/page-31/,/page-3/page-32/,/page-3/page-33/', ), # Exactly the same tests, but with feincms_nav instead of feincms_navigation ( {'feincms_page': Page.objects.get(pk=1)}, '{% load feincms_page_tags %}{% feincms_nav feincms_page level=1 depth=2 as nav %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-1/,/page-1/page-11/,/page-1/page-12/,/page-1/page-13/,/page-2/,/page-2/page-22/,/page-2/page-23/,/page-3/,/page-3/page-31/,/page-3/page-32/,/page-3/page-33/', ), ( {'feincms_page': Page.objects.get(pk=14)}, '{% load feincms_page_tags %}{% feincms_nav feincms_page level=2 depth=2 as nav %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-3/page-31/,/page-3/page-32/,/page-3/page-33/,/page-3/page-33/page-331/,/page-3/page-33/page-332/', ), ( {'feincms_page': Page.objects.get(pk=14)}, '{% load feincms_page_tags %}{% feincms_nav feincms_page level=2 depth=3 as nav %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-3/page-31/,/page-3/page-32/,/page-3/page-33/,/page-3/page-33/page-331/,/page-3/page-33/page-331/page-3311/,/page-3/page-33/page-332/', ), ( {'feincms_page': Page.objects.get(pk=19)}, '{% load feincms_page_tags %}{% feincms_nav feincms_page level=1 depth=2 as nav %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '/page-1/,/page-1/page-11/,/page-1/page-12/,/page-1/page-13/,/page-2/,/page-2/page-22/,/page-2/page-23/,/page-3/,/page-3/page-31/,/page-3/page-32/,/page-3/page-33/', ), ( {'feincms_page': Page.objects.get(pk=1)}, '{% load feincms_page_tags %}{% feincms_nav feincms_page level=3 depth=1 as nav %}{% for p in nav %}{{ p.get_absolute_url }}{% if not forloop.last %},{% endif %}{% endfor %}', '', ), ] for c, t, r in tests: self.assertEqual( template.Template(t).render(template.Context(c)), r) # Test that navigation entries do not exist several times, even with # navigation extensions. Apply the PassthroughExtension to a page # which does only have direct children, because it does not collect # pages further down the tree. page = Page.objects.get(pk=8) page.navigation_extension = 'testapp.navigation_extensions.PassthroughExtension' page.save() for c, t, r in tests: self.assertEqual( template.Template(t).render(template.Context(c)), r) # Now check that disabling a page also disables it in Navigation: p = Page.objects.get(pk=15) tmpl = '{% load feincms_page_tags %}{% feincms_navigation of feincms_page as nav level=1,depth=3 %}{% for p in nav %}{{ p.pk }}{% if not forloop.last %},{% endif %}{% endfor %}' data = template.Template(tmpl).render(template.Context({'feincms_page': p})), self.assertEqual(data, (u'1,2,3,4,6,7,8,10,11,12,13,14,15,16,18',), "Original navigation") p.active = False p.save() data = template.Template(tmpl).render(template.Context({'feincms_page': p})), self.assertEqual(data, (u'1,2,3,4,6,7,8,10,11,12,13,14',), "Navigation after disabling intermediate page") # Same test with feincms_nav tmpl = '{% load feincms_page_tags %}{% feincms_nav feincms_page level=1 depth=3 as nav %}{% for p in nav %}{{ p.pk }}{% if not forloop.last %},{% endif %}{% endfor %}' data = template.Template(tmpl).render(template.Context({'feincms_page': p})), self.assertEqual(data, (u'1,2,3,4,6,7,8,10,11,12,13,14',), "Navigation after disabling intermediate page") p.active = True p.save() data = template.Template(tmpl).render(template.Context({'feincms_page': p})), self.assertEqual(data, (u'1,2,3,4,6,7,8,10,11,12,13,14,15,16,18',), "Original navigation") def test_18_default_render_method(self): """ Test the default render() behavior of selecting render_<region> methods to do the (not so) heavy lifting. """ class Something(models.Model): class Meta: abstract = True def render_main(self): return u'Hello' # do not register this model in the internal FeinCMS bookkeeping structures tmp = Page._feincms_content_types[:] type = Page.create_content_type(Something, regions=('notexists',)) Page._feincms_content_types = tmp s = type(region='main', ordering='1') self.assertEqual(s.render(), 'Hello') def test_19_page_manager(self): self.create_default_page_set() page = Page.objects.get(pk=2) page.active = True page.save() self.assertRaises(Page.DoesNotExist, lambda: Page.objects.page_for_path(page.get_absolute_url())) self.assertRaises(Page.DoesNotExist, lambda: Page.objects.best_match_for_path( page.get_absolute_url() + 'something/hello/')) self.assertRaises(Http404, lambda: Page.objects.best_match_for_path( '/blabla/blabla/', raise404=True)) self.assertRaises(Http404, lambda: Page.objects.page_for_path('/asdf/', raise404=True)) self.assertRaises(Page.DoesNotExist, lambda: Page.objects.best_match_for_path('/blabla/blabla/')) self.assertRaises(Page.DoesNotExist, lambda: Page.objects.page_for_path('/asdf/')) request = Empty() request.path = request.path_info = page.get_absolute_url() request.method = 'GET' request.get_full_path = lambda: '/xyz/' request.GET = {} request.META = {} request.user = AnonymousUser() # tadaa from django.utils import translation translation.activate(page.language) page.active = False page.save() self.assertRaises(Http404, lambda: Page.objects.for_request(request, raise404=True)) page.active = True page.save() self.assertRaises(Http404, lambda: Page.objects.for_request(request, raise404=True)) page.parent.active = True page.parent.save() self.assertEqual(page, Page.objects.for_request(request)) self.assertEqual(page, Page.objects.page_for_path(page.get_absolute_url())) self.assertEqual(page, Page.objects.best_match_for_path( page.get_absolute_url() + 'something/hello/')) old = feincms_settings.FEINCMS_ALLOW_EXTRA_PATH request.path += 'hello/' feincms_settings.FEINCMS_ALLOW_EXTRA_PATH = False self.assertEqual(self.client.get(request.path).status_code, 404) feincms_settings.FEINCMS_ALLOW_EXTRA_PATH = True self.assertEqual(self.client.get(request.path).status_code, 200) self.assertEqual(page, Page.objects.for_request(request, best_match=True)) feincms_settings.FEINCMS_ALLOW_EXTRA_PATH = old page_id = id(request._feincms_page) p = Page.objects.for_request(request) self.assertEqual(id(p), page_id) def test_20_redirects(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) page2 = Page.objects.get(pk=2) page2.active = True page2.publication_date = timezone.now() - timedelta(days=1) page2.override_url = '/blablabla/' page2.redirect_to = page1.get_absolute_url() page2.save() # regenerate cached URLs in the whole tree page1.active = True page1.save() page2 = Page.objects.get(pk=2) # page2 has been modified too, but its URL should not have changed try: self.assertRedirects(self.client.get('/blablabla/'), page1.get_absolute_url()) except TemplateDoesNotExist, e: # catch the error from rendering page1 if e.args != ('feincms_base.html',): raise def test_21_copy_content(self): self.create_default_page_set() page = Page.objects.get(pk=1) self.create_pagecontent(page) page2 = Page.objects.get(pk=2) page2.copy_content_from(page) self.assertEqual(len(page2.content.main), 1) def test_22_contactform(self): self.create_default_page_set() page = Page.objects.get(pk=1) page.active = True page.template_key = 'theother' page.save() page.contactformcontent_set.create(email='mail@example.com', subject='bla', region='main', ordering=0) request = Empty() request.method = 'GET' request.GET = {} request.META = {} request.user = Empty() request.user.is_authenticated = lambda: False request.user.get_and_delete_messages = lambda: () page.content.main[0].process(request) self.assertTrue('form' in page.content.main[0].render(request=request)) self.client.post(page.get_absolute_url(), { 'name': 'So what\'s your name, dude?', 'email': 'another@example.com', 'subject': 'This is a test. Please calm down', 'content': 'Hell on earth.', }) self.assertEquals(len(mail.outbox), 1) self.assertEquals(mail.outbox[0].subject, 'This is a test. Please calm down') def test_23_navigation_extension(self): self.create_default_page_set() page = Page.objects.get(pk=1) self.assertEqual(len(page.extended_navigation()), 0) page.navigation_extension = 'testapp.navigation_extensions.PassthroughExtension' page2 = Page.objects.get(pk=2) page2.active = True page2.in_navigation = True page2.save() self.assertEqual(list(page.extended_navigation()), [page2]) page.navigation_extension = 'testapp.navigation_extensions.ThisExtensionDoesNotExist' self.assertEqual(len(page.extended_navigation()), 1) page.navigation_extension = 'testapp.navigation_extensions.PretenderExtension' self.assertEqual(page.extended_navigation()[0].get_absolute_url(), '/asdsa/') def test_24_admin_redirects(self): self.create_default_page_set() page = Page.objects.get(pk=1) response = self.create_pagecontent(page, _continue=1) self.assertRedirects(response, '/admin/page/page/1/') response = self.create_pagecontent(page, _addanother=1) self.assertRedirects(response, '/admin/page/page/add/') response = self.create_pagecontent(page) self.assertRedirects(response, '/admin/page/page/') def test_25_applicationcontent(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) page1.active = True page1.save() page = Page.objects.get(pk=2) page.active = True page.template_key = 'theother' page.save() # Should not be published because the page has no application contents and should # therefore not catch anything below it. self.is_published(page1.get_absolute_url() + 'anything/', False) page.applicationcontent_set.create( region='main', ordering=0, urlconf_path='testapp.applicationcontent_urls') self.assertContains(self.client.get(page.get_absolute_url()), 'module_root') self.assertContains(self.client.get(page.get_absolute_url() + 'args_test/abc/def/'), 'abc-def') self.assertContains(self.client.get(page.get_absolute_url() + 'kwargs_test/abc/def/'), 'def-abc') response = self.client.get(page.get_absolute_url() + 'full_reverse_test/') self.assertContains(response, 'home:/test-page/test-child-page/') self.assertContains(response, 'args:/test-page/test-child-page/args_test/xy/zzy/') self.assertContains(response, 'base:/test/') self.assertContains(response, 'homeas:/test-page/test-child-page/') self.assertEqual(app_reverse('ac_module_root', 'testapp.applicationcontent_urls'), '/test-page/test-child-page/') if hasattr(self, 'assertNumQueries'): self.assertNumQueries(0, lambda: app_reverse('ac_module_root', 'testapp.applicationcontent_urls')) _empty_reverse_cache() self.assertNumQueries(1, lambda: app_reverse('ac_module_root', 'testapp.applicationcontent_urls')) self.assertNumQueries(0, lambda: app_reverse('ac_module_root', 'testapp.applicationcontent_urls')) # This should not raise self.assertEquals(self.client.get(page.get_absolute_url() + 'notexists/').status_code, 404) self.assertContains(self.client.get(page.get_absolute_url() + 'fragment/'), '<span id="something">some things</span>') self.assertRedirects(self.client.get(page.get_absolute_url() + 'redirect/'), page.get_absolute_url()) self.assertEqual(app_reverse('ac_module_root', 'testapp.applicationcontent_urls'), page.get_absolute_url()) response = self.client.get(page.get_absolute_url() + 'response/') self.assertContains(response, 'Anything') self.assertContains(response, '<h2>Main content</h2>') # Ensure response has been wrapped # Test standalone behavior self.assertEqual( self.client.get(page.get_absolute_url() + 'response/', HTTP_X_REQUESTED_WITH='XMLHttpRequest').content, self.client.get(page.get_absolute_url() + 'response_decorated/').content) # Test reversing of URLs (with overridden urls too) page.applicationcontent_set.create( region='main', ordering=1, urlconf_path='testapp.blog_urls') page1.applicationcontent_set.create( region='main', ordering=0, urlconf_path='whatever') response = self.client.get(page.get_absolute_url() + 'alias_reverse_test/') self.assertContains(response, 'home:/test-page/') self.assertContains(response, 'args:/test-page/args_test/xy/zzy/') self.assertContains(response, 'base:/test/') self.assertEqual(app_reverse('blog_entry_list', 'testapp.blog_urls'), '/test-page/test-child-page/') self.assertEqual(app_reverse('ac_module_root', 'testapp.applicationcontent_urls'), '/test-page/test-child-page/') self.assertEqual(app_reverse('ac_module_root', 'whatever'), '/test-page/') page.applicationcontent_set.get(urlconf_path='testapp.applicationcontent_urls').delete() self.assertEqual(app_reverse('blog_entry_list', 'testapp.blog_urls'), '/test-page/test-child-page/') self.assertEqual(app_reverse('ac_module_root', 'whatever'), '/test-page/') # Ensure ApplicationContent's admin_fields support works properly self.assertContains(self.client.get('/admin/page/page/%d/' % page.id), 'exclusive_subpages') def test_26_page_form_initial(self): self.create_default_page_set() self.assertEqual(self.client.get('/admin/page/page/add/?translation_of=1&lang=de').status_code, 200) self.assertEqual(self.client.get('/admin/page/page/add/?parent=1').status_code, 200) self.assertEqual(self.client.get('/admin/page/page/add/?parent=2').status_code, 200) def test_27_cached_url_clash(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) page2 = Page.objects.get(pk=2) page1.override_url = '/' page1.active = True page1.save() self.assertContains(self.create_pagecontent(page2, active=True, override_url='/'), 'already taken by') def test_28_applicationcontent_reverse(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) page1.active = True page1.save() page = Page.objects.get(pk=2) page.active = True page.template_key = 'theother' page.save() page.applicationcontent_set.create( region='main', ordering=0, urlconf_path='testapp.applicationcontent_urls') from feincms.content.application.models import app_reverse, reverse # test app_reverse self.assertEqual(app_reverse('ac_module_root', 'testapp.applicationcontent_urls'), page.get_absolute_url()) # when specific applicationcontent exists more then once reverse should return url # for the one that has tree_id same as current feincms page self.create_page(title='Home DE', language='de', active=True) page_de = Page.objects.get(title='Home DE') self.create_page(title='Child 1 DE', language='de', parent=page_de.id, active=True) page_de_1 = Page.objects.get(title='Child 1 DE') page_de_1.applicationcontent_set.create( region='main', ordering=0, urlconf_path='testapp.applicationcontent_urls') _empty_reverse_cache() settings.TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), 'templates'),) self.client.get(page_de_1.get_absolute_url()) self.assertEqual(app_reverse('ac_module_root', 'testapp.applicationcontent_urls'), page_de_1.get_absolute_url()) self.client.get(page1.get_absolute_url()) self.assertEqual(app_reverse('ac_module_root', 'testapp.applicationcontent_urls'), page.get_absolute_url()) def test_29_medialibrary_admin(self): self.create_default_page_set() page = Page.objects.get(pk=1) mediafile = MediaFile.objects.create(file='somefile.jpg') page.mediafilecontent_set.create( mediafile=mediafile, region='main', type='default', ordering=1) self.assertContains(self.client.get('/admin/medialibrary/mediafile/'), 'somefile.jpg') import zipfile zf = zipfile.ZipFile('test.zip', 'w') for i in range(10): zf.writestr('test%d.jpg' % i, 'test%d' % i) zf.close() self.assertRedirects(self.client.post('/admin/medialibrary/mediafile/mediafile-bulk-upload/', { 'data': open('test.zip'), }), '/admin/medialibrary/mediafile/') self.assertEqual(MediaFile.objects.count(), 11, "Upload of media files with ZIP does not work") self.assertRedirects(self.client.post('/admin/medialibrary/mediafile/add/', { 'file': open(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'docs', 'images', 'tree_editor.png')), 'translations-TOTAL_FORMS': 0, 'translations-INITIAL_FORMS': 0, 'translations-MAX_NUM_FORMS': 10, }), '/admin/medialibrary/mediafile/') self.assertContains(self.client.get('/admin/medialibrary/mediafile/'), '100x100.png" alt="" />') stats = list(MediaFile.objects.values_list('type', flat=True)) self.assertEqual(stats.count('image'), 12) self.assertEqual(stats.count('other'), 0) def test_30_context_processors(self): self.create_default_page_set() Page.objects.update(active=True, in_navigation=True) request = Empty() request.GET = {} request.META = {} request.method = 'GET' request.path = request.path_info = '/test-page/test-child-page/abcdef/' request.get_full_path = lambda: '/test-page/test-child-page/abcdef/' ctx = add_page_if_missing(request) self.assertEqual(ctx['feincms_page'], request._feincms_page) def test_31_sites_framework_associating_with_single_site(self): self.login() site_2 = Site.objects.create(name='site 2', domain='2.example.com') self.create_page('site 1 homepage', override_url='/', active=True) self.create_page('site 2 homepage', override_url='/', site=site_2.id, active=True) self.assertEqual(Page.objects.count(), 2) self.assertEqual(Page.objects.active().count(), 1) def test_32_applicationcontent_inheritance20(self): self.create_default_page_set() page1 = Page.objects.get(pk=1) page1.active = True page1.save() page = Page.objects.get(pk=2) page.active = True page.template_key = 'theother' page.save() # Should not be published because the page has no application contents and should # therefore not catch anything below it. self.is_published(page1.get_absolute_url() + 'anything/', False) page.applicationcontent_set.create( region='main', ordering=0, urlconf_path='testapp.applicationcontent_urls') page.rawcontent_set.create( region='main', ordering=1, text='some_main_region_text') page.rawcontent_set.create( region='sidebar', ordering=0, text='some_sidebar_region_text') self.assertContains(self.client.get(page.get_absolute_url()), 'module_root') response = self.client.get(page.get_absolute_url() + 'inheritance20/') self.assertContains(response, 'a content 42') self.assertContains(response, 'b content') self.assertNotContains(response, 'some_main_region_text') self.assertContains(response, 'some_sidebar_region_text') self.assertNotContains(response, 'some content outside') def test_33_preview(self): self.create_default_page_set() page = Page.objects.get(pk=1) page.template_key = 'theother' page.save() page.rawcontent_set.create( region='main', ordering=0, text='Example content') self.assertEquals(self.client.get(page.get_absolute_url()).status_code, 404) self.assertContains(self.client.get('%s_preview/%s/' % (page.get_absolute_url(), page.pk)), 'Example content') def test_34_access(self): self.create_default_page_set() page = Page.objects.get(pk=1) page.override_url = '/something/' page.save() Page.objects.update(active=True) self.create_page(title='redirect page', override_url='/', redirect_to=page.get_absolute_url(), active=True) # / -> redirect to /something/ r = self.client.get('/') self.assertRedirects(r, page.get_absolute_url()) # /something/ should work r = self.client.get(page.override_url) self.assertEquals(r.status_code, 200) # /foo not existant -> 404 r = self.client.get('/foo/') self.assertEquals(r.status_code, 404) def test_35_access_with_extra_path(self): self.login() self.create_page(title='redirect again', override_url='/', redirect_to='/somewhere/', active=True) self.create_page(title='somewhere', active=True) r = self.client.get('/') self.assertRedirects(r, '/somewhere/') r = self.client.get('/dingdong/') self.assertEquals(r.status_code, 404) old = feincms_settings.FEINCMS_ALLOW_EXTRA_PATH feincms_settings.FEINCMS_ALLOW_EXTRA_PATH = True r = self.client.get('/') self.assertRedirects(r, '/somewhere/') r = self.client.get('/dingdong/') self.assertEquals(r.status_code, 404) feincms_settings.FEINCMS_ALLOW_EXTRA_PATH = old def test_36_sitemaps(self): response = self.client.get('/sitemap.xml') self.assertContains(response, '<urlset', status_code=200) self.login() response = self.create_page() response = self.client.get('/sitemap.xml') self.assertNotContains(response, '<url>', status_code=200) page = Page.objects.get() page.active = True page.in_navigation = True page.save() response = self.client.get('/sitemap.xml') self.assertContains(response, '<url>', status_code=200) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/tests/tests.py����������������������������������������������������������������0000664�0000000�0000000�00000013405�12122555434�0017457�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ from django.contrib.auth.models import User from django.test import TestCase from feincms.content.contactform.models import ContactFormContent, ContactForm from feincms.content.file.models import FileContent from feincms.models import Region, Template, Base from feincms.module.blog.models import Entry from feincms.module.page import processors from feincms.module.page.models import Page from feincms.utils import collect_dict_values, get_object # ------------------------------------------------------------------------ class Empty(object): """ Helper class to use as request substitute (or whatever) """ pass class TranslationsTest(TestCase): def test_short_language_code(self): # this is quite stupid, but it's the first time I do something # with TestCase import feincms.translations import doctest doctest.testmod(feincms.translations) class ModelsTest(TestCase): def test_region(self): # Creation should not fail r = Region('region', 'region title') t = Template('base template', 'base.html', ( ('region', 'region title'), Region('region2', 'region2 title'), )) # I'm not sure whether this test tests anything at all self.assertEqual(r.key, t.regions[0].key) self.assertEqual(unicode(r), 'region title') class UtilsTest(TestCase): def test_get_object(self): self.assertRaises(AttributeError, lambda: get_object('feincms.does_not_exist')) self.assertRaises(ImportError, lambda: get_object('feincms.does_not_exist.fn')) self.assertEqual(get_object, get_object('feincms.utils.get_object')) def test_collect_dict_values(self): self.assertEqual({'a': [1, 2], 'b': [3]}, collect_dict_values([('a', 1), ('a', 2), ('b', 3)])) class ExampleCMSBase(Base): pass ExampleCMSBase.register_regions(('region', 'region title'), ('region2', 'region2 title')) class ExampleCMSBase2(Base): pass ExampleCMSBase2.register_regions(('region', 'region title'), ('region2', 'region2 title')) Page.register_extensions( 'feincms.module.extensions.datepublisher', 'feincms.module.extensions.translations', 'feincms.module.extensions.ct_tracker', 'feincms.module.extensions.seo', 'feincms.module.extensions.changedate', 'feincms.module.extensions.seo', # duplicate 'feincms.module.page.extensions.navigation', 'feincms.module.page.extensions.symlinks', 'feincms.module.page.extensions.titles', ) Page.create_content_type(ContactFormContent, form=ContactForm) Page.create_content_type(FileContent) Page.register_request_processor(processors.etag_request_processor) Page.register_response_processor(processors.etag_response_processor) Page.register_response_processor(processors.debug_sql_queries_response_processor()) Entry.register_extensions( 'feincms.module.extensions.seo', 'feincms.module.extensions.translations', 'feincms.module.extensions.seo', 'feincms.module.extensions.ct_tracker', ) class BlogTestCase(TestCase): def setUp(self): u = User(username='test', is_active=True, is_staff=True, is_superuser=True) u.set_password('test') u.save() Entry.register_regions(('main', 'Main region'), ('another', 'Another region')) def login(self): self.assertTrue(self.client.login(username='test', password='test')) def create_entry(self): entry = Entry.objects.create( published=True, title='Something', slug='something', language='en') entry.rawcontent_set.create( region='main', ordering=0, text='Something awful') return entry def create_entries(self): entry = self.create_entry() Entry.objects.create( published=True, title='Something 2', slug='something-2', language='de', translation_of=entry) Entry.objects.create( published=True, title='Something 3', slug='something-3', language='de') def test_01_smoke_test_admin(self): self.create_entry() self.login() self.assertEqual(self.client.get('/admin/blog/entry/').status_code, 200) self.assertEqual(self.client.get('/admin/blog/entry/1/').status_code, 200) def test_02_translations(self): self.create_entries() entries = Entry.objects.in_bulk((1, 2, 3)) self.assertEqual(len(entries[1].available_translations()), 1) self.assertEqual(len(entries[2].available_translations()), 1) self.assertEqual(len(entries[3].available_translations()), 0) def test_03_admin(self): self.login() self.create_entries() self.assertEqual(self.client.get('/admin/blog/entry/').status_code, 200) self.assertEqual(self.client.get('/admin/blog/entry/1/').status_code, 200) class CleanseTestCase(TestCase): def test_01_cleanse(self): from feincms.utils.html.cleanse import cleanse_html entries = [ (u'<p> </p>', u''), (u'<span style="font-weight: bold;">Something</span><p></p>', u'<strong>Something</strong>'), (u'<p>abc <span>def <em>ghi</em> jkl</span> mno</p>', u'<p>abc def <em>ghi</em> jkl mno</p>'), (u'<span style="font-style: italic;">Something</span><p></p>', u'<em>Something</em>'), (u'<p>abc<br />def</p>', u'<p>abc<br />def</p>'), (u'<p><p><p> </p> </p><p><br /></p></p>', u' '), ] for a, b in entries: self.assertEqual(cleanse_html(a), b) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/translations.py���������������������������������������������������������������0000664�0000000�0000000�00000023223�12122555434�0017673�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" This module offers functions and abstract base classes that can be used to store translated models. There isn't much magic going on here. Usage example:: class News(models.Model, TranslatedObjectMixin): active = models.BooleanField(default=False) created = models.DateTimeField(default=timezone.now) class NewsTranslation(Translation(News)): title = models.CharField(max_length=200) body = models.TextField() Print the titles of all news entries either in the current language (if available) or in any other language:: for news in News.objects.all(): print news.translation.title Print all the titles of all news entries which have an english translation:: from django.utils import translation translation.activate('en') for news in News.objects.filter(translations__language_code='en'): print news.translation.title """ from django.conf import settings from django.contrib import admin from django.core.cache import cache from django.core.exceptions import ObjectDoesNotExist from django.db import models from django.db.models import Q from django.utils import translation from django.utils.translation import ugettext_lazy as _ from feincms.utils import queryset_transform class _NoTranslation(object): """Simple marker for when no translations exist for a certain object Only used for caching.""" pass def short_language_code(code=None): """ Extract the short language code from its argument (or return the default language code). >>> from django.conf import settings >>> short_language_code('de') 'de' >>> short_language_code('de-at') 'de' >>> short_language_code() == short_language_code(settings.LANGUAGE_CODE) True """ if code is None: code = translation.get_language() pos = code.find('-') if pos > -1: return code[:pos] return code def is_primary_language(language=None): """ Returns true if current or passed language is the primary language for this site. (The primary language is defined as the first language in settings.LANGUAGES.) """ if not language: language = translation.get_language() return language == settings.LANGUAGES[0][0] def lookup_translations(language_code=None): """ Pass the return value of this function to .transform() to automatically resolve translation objects The current language is used if ``language_code`` isn't specified. """ def _transform(qs): lang_ = language_code if language_code else translation.get_language() instance_dict = {} # Don't do anything for those who already have a cached translation available for instance in qs: trans = cache.get(instance.get_translation_cache_key(lang_)) if trans: if trans is _NoTranslation: instance._cached_translation = None else: instance._cached_translation = trans else: instance_dict[instance.pk] = instance # We really, really need something in here to continue if not instance_dict: return candidates = instance_dict.values()[0].translations.model._default_manager.all() if instance_dict: _process(candidates, instance_dict, lang_, 'iexact') if instance_dict: _process(candidates, instance_dict, settings.LANGUAGE_CODE, 'istartswith') if instance_dict: for candidate in candidates.filter(parent__pk__in=instance_dict.keys()): if candidate.parent_id in instance_dict: _found(instance_dict, candidate) # No translations for the rest for instance in instance_dict.values(): instance._cached_translation = None def _found(instance_dict, candidate): parent = instance_dict[candidate.parent_id] cache.set(parent.get_translation_cache_key(), candidate) parent._cached_translation = candidate candidate.parent = parent del instance_dict[candidate.parent_id] def _process(candidates, instance_dict, lang_, op_): for candidate in candidates.filter( Q(parent__pk__in=instance_dict.keys()), Q(**{'language_code__' + op_: lang_}) | Q(**{'language_code__' + op_: short_language_code(lang_)}) ).order_by('-language_code'): # The candidate's parent might already have a translation by now if candidate.parent_id in instance_dict: _found(instance_dict, candidate) return _transform class TranslatedObjectManager(queryset_transform.TransformManager): """ This manager offers convenience methods. """ def only_language(self, language=short_language_code): """ Only return objects which have a translation into the given language. Uses the currently active language by default. """ return self.filter(translations__language_code=language) class TranslatedObjectMixin(object): """ Mixin with helper methods. """ def _get_translation_object(self, queryset, language_code): try: return queryset.filter( Q(language_code__iexact=language_code) | Q(language_code__iexact=short_language_code(language_code)) ).order_by('-language_code')[0] except IndexError: try: return queryset.filter( Q(language_code__istartswith=settings.LANGUAGE_CODE) | Q(language_code__istartswith=short_language_code(settings.LANGUAGE_CODE)) ).order_by('-language_code')[0] except IndexError: try: return queryset.all()[0] except IndexError: raise queryset.model.DoesNotExist def get_translation_cache_key(self, language_code=None): """Return the cache key used to cache this object's translations so we can purge on-demand""" if not language_code: language_code = translation.get_language() return (('FEINCMS:%d:XLATION:' % getattr(settings, 'SITE_ID', 0)) + '-'.join(['%s' % s for s in self._meta.db_table, self.id, language_code, ])) def get_translation(self, language_code=None): if not language_code: language_code = translation.get_language() key = self.get_translation_cache_key(language_code) trans = cache.get(key) if trans is None: try: trans = self._get_translation_object(self.translations.all(), language_code) except ObjectDoesNotExist: trans = _NoTranslation cache.set(key, trans) if trans is _NoTranslation: return None # Assign self to prevent additional database queries trans.parent = self return trans @property def translation(self): if not hasattr(self, '_cached_translation'): self._cached_translation = self.get_translation() return self._cached_translation @property def available_translations(self): return self.translations.values_list('language_code', flat=True) def __unicode__(self): try: translation = self.translation except ObjectDoesNotExist: return self.__class__.__name__ if translation: return unicode(translation) return self.__class__.__name__ def get_absolute_url(self): return self.translation.get_absolute_url() def purge_translation_cache(self): cache.delete(self.get_translation_cache_key()) for lang in self.available_translations: cache.delete(self.get_translation_cache_key(lang)) try: del self._cached_translation except AttributeError: pass def Translation(model): """ Return a class which can be used as inheritance base for translation models """ class Inner(models.Model): parent = models.ForeignKey(model, related_name='translations') language_code = models.CharField(_('language'), max_length=10, choices=settings.LANGUAGES, default=settings.LANGUAGES[0][0], editable=len(settings.LANGUAGES) > 1) class Meta: unique_together = ('parent', 'language_code') # (beware the above will not be inherited automatically if you # provide a Meta class within your translation subclass) abstract = True def short_language_code(self): return short_language_code(self.language_code) def save(self, *args, **kwargs): super(Inner, self).save(*args, **kwargs) self.parent.purge_translation_cache() save.alters_data = True def delete(self, *args, **kwargs): super(Inner, self).delete(*args, **kwargs) self.parent.purge_translation_cache() delete.alters_data = True return Inner def admin_translationinline(model, inline_class=admin.StackedInline, **kwargs): """ Returns a new inline type suitable for the Django administration:: from django.contrib import admin from myapp.models import News, NewsTranslation admin.site.register(News, inlines=[ admin_translationinline(NewsTranslation), ], ) """ kwargs['extra'] = 1 kwargs['max_num'] = len(settings.LANGUAGES) kwargs['model'] = model return type(model.__class__.__name__ + 'Inline', (inline_class,), kwargs) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/urls.py�����������������������������������������������������������������������0000664�0000000�0000000�00000000116�12122555434�0016133�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ from __future__ import absolute_import from feincms.views.cbv.urls import * ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0015736�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/__init__.py�������������������������������������������������������������0000664�0000000�0000000�00000006407�12122555434�0020056�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ # coding=utf-8 # ------------------------------------------------------------------------ try: from hashlib import md5 except ImportError: import md5 from django.conf import settings as django_settings from django.db.models import AutoField from django.utils.importlib import import_module # ------------------------------------------------------------------------ def get_object(path, fail_silently=False): # Return early if path isn't a string (might already be an callable or # a class or whatever) if not isinstance(path, (str, unicode)): return path try: return import_module(path) except ImportError: try: dot = path.rindex('.') mod, fn = path[:dot], path[dot+1:] return getattr(import_module(mod), fn) except (AttributeError, ImportError): if not fail_silently: raise # ------------------------------------------------------------------------ def collect_dict_values(data): dic = {} for key, value in data: dic.setdefault(key, []).append(value) return dic # ------------------------------------------------------------------------ def copy_model_instance(obj, exclude=None): """ Copy a model instance, excluding primary key and optionally a list of specified fields. """ exclude = exclude or () initial = dict([(f.name, getattr(obj, f.name)) for f in obj._meta.fields if not isinstance(f, AutoField) and \ not f.name in exclude and \ not f in obj._meta.parents.values()]) return obj.__class__(**initial) # ------------------------------------------------------------------------ def shorten_string(str, max_length=50): """ Shorten a string for display, truncate it intelligently when too long. Try to cut it in 2/3 + ellipsis + 1/3 of the original title. The first part also try to cut at white space instead of in mid-word. """ if len(str) >= max_length: first_part = int(max_length * 0.6) next_space = str[first_part:(max_length / 2 - first_part)].find(' ') if next_space >= 0: first_part += next_space return str[:first_part] + u' … ' + str[-(max_length - first_part):] return str # ------------------------------------------------------------------------ def path_to_cache_key(path, max_length=200, prefix=""): """ Convert a string (path) into something that can be fed to django's cache mechanism as cache key. Ensure the string stays below the max key size, so if too long, hash it and use that instead. """ from django.utils.encoding import iri_to_uri path = iri_to_uri(path) # logic below borrowed from http://richwklein.com/2009/08/04/improving-django-cache-part-ii/ # via acdha's django-sugar if len(path) > max_length: m = md5() m.update(path) path = m.hexdigest() + '-' + path[:max_length - 20] cache_key = 'FEINCMS:%d:%s:%s' % ( getattr(django_settings, 'SITE_ID', 0), prefix, path, ) return cache_key # ------------------------------------------------------------------------ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/html/�������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0016702�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/html/__init__.py��������������������������������������������������������0000664�0000000�0000000�00000000000�12122555434�0021001�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/html/cleanse.py���������������������������������������������������������0000664�0000000�0000000�00000013221�12122555434�0020665�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from BeautifulSoup import BeautifulSoup import lxml.html import lxml.html.clean import re import unicodedata import warnings warnings.warn("The module feincms.utils.html.cleanse is being deprecated." " Please use the feincms-cleanse package (installable with pip) instead." " Improvements will only be made in the feincms-cleanse package. This" " module will be removed in FeinCMS v1.8.", DeprecationWarning, stacklevel=2) cleanse_html_allowed = { 'a': ('href', 'name', 'target', 'title'), 'h2': (), 'h3': (), 'strong': (), 'em': (), 'p': (), 'ul': (), 'ol': (), 'li': (), 'span': (), 'br': (), 'sub': (), 'sup': (), 'anything': (), } cleanse_html_allowed_empty_tags = ('br',) cleanse_html_merge = ('h2', 'h3', 'strong', 'em', 'ul', 'ol', 'sub', 'sup') def cleanse_html(html): """ Clean HTML code from ugly copy-pasted CSS and empty elements Removes everything not explicitly allowed in ``cleanse_html_allowed``. Requires ``lxml`` and ``beautifulsoup``. """ doc = lxml.html.fromstring('<anything>%s</anything>' % html) try: ignore = lxml.html.tostring(doc, encoding=unicode) except UnicodeDecodeError: # fall back to slower BeautifulSoup if parsing failed from lxml.html import soupparser doc = soupparser.fromstring(u'<anything>%s</anything>' % html) cleaner = lxml.html.clean.Cleaner( allow_tags=cleanse_html_allowed.keys() + ['style'], remove_unknown_tags=False, # preserve surrounding 'anything' tag style=False, safe_attrs_only=False, # do not strip out style # attributes; we still need # the style information to # convert spans into em/strong # tags ) cleaner(doc) # walk the tree recursively, because we want to be able to remove # previously emptied elements completely for element in reversed(list(doc.iterdescendants())): if element.tag == 'style': element.drop_tree() continue # convert span elements into em/strong if a matching style rule # has been found. strong has precedence, strong & em at the same # time is not supported elif element.tag == 'span': style = element.attrib.get('style') if style: if 'bold' in style: element.tag = 'strong' elif 'italic' in style: element.tag = 'em' if element.tag == 'span': # still span element.drop_tag() # remove tag, but preserve children and text continue # remove empty tags if they are not <br /> elif not element.text and element.tag not in \ cleanse_html_allowed_empty_tags and not \ len(list(element.iterdescendants())): element.drop_tag() continue # remove all attributes which are not explicitly allowed allowed = cleanse_html_allowed.get(element.tag, []) for key in element.attrib.keys(): if key not in allowed: del element.attrib[key] # just to be sure, run cleaner again, but this time with even more # strict settings cleaner = lxml.html.clean.Cleaner( allow_tags=cleanse_html_allowed.keys(), remove_unknown_tags=False, # preserve surrounding 'anything' tag style=True, safe_attrs_only=True ) cleaner(doc) html = lxml.html.tostring(doc, method='xml') # remove all sorts of newline characters html = html.replace('\n', ' ').replace('\r', ' ') html = html.replace(' ', ' ').replace(' ', ' ') html = html.replace(' ', ' ').replace(' ', ' ') # remove wrapping tag needed by XML parser html = re.sub(r'</?anything>', '', html) # remove elements containing only whitespace or linebreaks whitespace_re = re.compile(r'<([a-z0-9]+)>(<br\s*/>|\ |\ |\s)*</\1>') while True: new = whitespace_re.sub('', html) if new == html: break html = new # merge tags for tag in cleanse_html_merge: merge_str = u'</%s><%s>' while True: new = html.replace(merge_str, u'') if new == html: break html = new # fix p-in-p tags p_in_p_start_re = re.compile(r'<p>(\ |\ |\s)*<p>') p_in_p_end_re = re.compile('</p>(\ |\ |\s)*</p>') for tag in cleanse_html_merge: merge_start_re = re.compile('<p>(\\ |\\ |\\s)*<%s>(\\ |\\ |\\s)*<p>' % tag) merge_end_re = re.compile('</p>(\\ |\\ |\\s)*</%s>(\\ |\\ |\\s)*</p>' % tag) while True: new = merge_start_re.sub('<p>', html) new = merge_end_re.sub('</p>', new) new = p_in_p_start_re.sub('<p>', new) new = p_in_p_end_re.sub('</p>', new) if new == html: break html = new # remove list markers with <li> tags before them html = re.sub(r'<li>(\ |\ |\s)*(-|\*|·)(\ |\ |\s)*', '<li>', html) # remove p-in-li tags html = re.sub(r'<li>(\ |\ |\s)*<p>', '<li>', html) html = re.sub(r'</p>(\ |\ |\s)*</li>', '</li>', html) # add a space before the closing slash in empty tags html = re.sub(r'<([^/>]+)/>', r'<\1 />', html) # nicify entities and normalize unicode html = unicode(BeautifulSoup(html, convertEntities='xml')) html = unicodedata.normalize('NFKC', html) return html �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/html/tidy.py������������������������������������������������������������0000664�0000000�0000000�00000005211�12122555434�0020224�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# encoding: utf-8 import re import tidylib # Based on http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python # # We omit chars 9-13 (tab, newline, vertical tab, form feed, return) and 32 # (space) to avoid clogging our reports with warnings about common, # non-problematic codes but still allow stripping things which will cause lxml # to choke CONTROL_CHAR_RE = re.compile('[%s]' % "".join( re.escape(unichr(c)) for c in range(0, 8) + range(14, 31) + range(127, 160) )) def tidy_html(html): """ Process an input string containing HTML and return a tuple (xhtml, errors, warnings) containing the output of tidylib and lists of validation errors and warnings. Input must be unicode. Output will be valid XHTML. """ if not isinstance(html, unicode): raise ValueError("tidyhtml must be called with a Unicode string!") errors = list() warnings = list() # First, deal with embedded control codes: html, sub_count = CONTROL_CHAR_RE.subn(" ", html) if sub_count: warnings.append("Stripped %d control characters from body: %s" % ( sub_count, set(ord(i) for i in CONTROL_CHAR_RE.findall(html)) )) # tidylib.tidy_fragment will choke if given a full HTML document. This is a # primitive content sniff to decide whether to call tidy_document instead: if "<html" in html[:1024]: tidy_f = tidylib.tidy_document doc_mode = True else: tidy_f = tidylib.tidy_fragment doc_mode = False html, messages = tidy_f( html.strip(), { "char-encoding": "utf8", "clean": False, "drop-empty-paras": False, "drop-font-tags": True, "drop-proprietary-attributes": False, "fix-backslash": True, "indent": True, "output-xhtml": True, } ) messages = filter(None, (l.strip() for l in messages.split("\n") if l)) # postprocess warnings to avoid HTML fragments being reported as lacking # doctype and title: for msg in messages: if not doc_mode and "Warning: missing <!DOCTYPE> declaration" in msg: continue if not doc_mode and "Warning: inserting missing 'title' element" in msg: continue if not doc_mode and "Warning: inserting implicit <body>" in msg: continue if "Error:" in msg: errors.append(msg) else: warnings.append(msg) return html, errors, warnings ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/managers.py�������������������������������������������������������������0000664�0000000�0000000�00000003716�12122555434�0020114�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ------------------------------------------------------------------------ class ActiveAwareContentManagerMixin(object): """ Implement what's necessary to add some kind of "active" state for content objects. The notion of active is defined by a number of filter rules that must all match (AND) for the object to be active. A Manager for a content class using the "datepublisher" extension should either adopt this mixin or implement a similar interface. """ # A dict of filters which are used to determine whether a page is active or not. # Extended for example in the datepublisher extension (date-based publishing and # un-publishing of pages). This will be set in add_to_active_filters() below, # so we won't share the same dict for derived managers, do not replace with {} here! active_filters = None @classmethod def apply_active_filters(cls, queryset): """ Apply all filters defined to the queryset passed and return the result. """ if cls.active_filters is not None: for filt in cls.active_filters.values() or (): if callable(filt): queryset = filt(queryset) else: queryset = queryset.filter(filt) return queryset @classmethod def add_to_active_filters(cls, filter, key=None): """ Add a new clause to the active filters. A filter may be either a Q object to be applied to the content class or a callable taking a queryset and spitting out a new one. If a filter with the given `key` already exists, the new filter replaces the old. """ if cls.active_filters is None: cls.active_filters = {} if key is None: key = filter cls.active_filters[key] = filter def active(self): """ Return only currently active objects. """ return self.apply_active_filters(self) ��������������������������������������������������feincms-1.7.4/feincms/utils/queryset_transform.py���������������������������������������������������0000664�0000000�0000000�00000010063�12122555434�0022264�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Straight import from https://github.com/simonw/django-queryset-transform """ django_queryset_transform ========================= Allows you to register a transforming map function with a Django QuerySet that will be executed only when the QuerySet itself has been evaluated. This allows you to build optimisations like "fetch all tags for these 10 rows" while still benefiting from Django's lazy QuerySet evaluation. For example: def lookup_tags(item_qs): item_pks = [item.pk for item in item_qs] m2mfield = Item._meta.get_field_by_name('tags')[0] tags_for_item = Tag.objects.filter( item__in = item_pks ).extra(select = { 'item_id': '%s.%s' % ( m2mfield.m2m_db_table(), m2mfield.m2m_column_name() ) }) tag_dict = {} for tag in tags_for_item: tag_dict.setdefault(tag.item_id, []).append(tag) for item in item_qs: item.fetched_tags = tag_dict.get(item.pk, []) qs = Item.objects.filter(name__contains = 'e').transform(lookup_tags) for item in qs: print item, item.fetched_tags Prints: Winter comes to Ogglesbrook [<sledging>, <snow>, <winter>, <skating>] Summer now [<skating>, <sunny>] But only executes two SQL queries - one to fetch the items, and one to fetch ALL of the tags for those items. Since the transformer function can transform an evaluated QuerySet, it doesn't need to make extra database calls at all - it should work for things like looking up additional data from a cache.multi_get() as well. Originally inspired by http://github.com/lilspikey/django-batch-select/ LICENSE ======= Copyright (c) 2010, Simon Willison. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of Django nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ from django.db import models class TransformQuerySet(models.query.QuerySet): def __init__(self, *args, **kwargs): super(TransformQuerySet, self).__init__(*args, **kwargs) self._transform_fns = [] def _clone(self, klass=None, setup=False, **kw): c = super(TransformQuerySet, self)._clone(klass, setup, **kw) c._transform_fns = self._transform_fns[:] return c def transform(self, fn): c = self._clone() c._transform_fns.append(fn) return c def iterator(self): result_iter = super(TransformQuerySet, self).iterator() if self._transform_fns: results = list(result_iter) for fn in self._transform_fns: fn(results) return iter(results) return result_iter class TransformManager(models.Manager): def get_query_set(self): return TransformQuerySet(self.model, using=self._db) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/utils/templatetags.py���������������������������������������������������������0000664�0000000�0000000�00000012561�12122555434�0021007�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������''' I really hate repeating myself. These are helpers that avoid typing the whole thing over and over when implementing additional template tags They help implementing tags of the following forms:: {% tag as var_name %} {% tag of template_var as var_name %} {% tag of template_var as var_name arg1,arg2,kwarg3=4 %} ''' from django import template def _parse_args(argstr, context=None): try: args = {} for token in argstr.split(','): if '=' in token: k, v = token.split('=', 1) if context: try: args[k] = template.Variable(v).resolve(context) except template.VariableDoesNotExist: args[k] = v else: args[k] = v else: args[token] = True return args except TypeError: raise template.TemplateSyntaxError('Malformed arguments') def do_simple_node_with_var_and_args_helper(cls): def _func(parser, token): try: tag_name, of_, in_var_name, args = token.contents.split() except ValueError: try: tag_name, of_, in_var_name = token.contents.split() args = '' except ValueError: raise template.TemplateSyntaxError, 'Invalid syntax for %s node: %s' % (cls.__name__, token.contents) return cls(tag_name, in_var_name, args) return _func class SimpleNodeWithVarAndArgs(template.Node): def __init__(self, tag_name, in_var_name, args): self.tag_name = tag_name self.in_var = template.Variable(in_var_name) self.args = args def render(self, context): self.render_context = context try: instance = self.in_var.resolve(context) except template.VariableDoesNotExist: return '' return self.what(instance, _parse_args(self.args, context)) def do_simple_node_with_var_helper(cls): def _func(parser, token): try: tag_name, of_, in_var_name = token.contents.split() except ValueError: raise template.TemplateSyntaxError, 'Invalid syntax for %s node: %s' % (cls.__name__, token.contents) return cls(tag_name, in_var_name) return _func class SimpleNodeWithVar(template.Node): def __init__(self, tag_name, in_var_name): self.tag_name = tag_name self.in_var = template.Variable(in_var_name) def render(self, context): self.render_context = context try: instance = self.in_var.resolve(context) except template.VariableDoesNotExist: return '' return self.what(instance) def do_simple_assignment_node_helper(cls): def _func(parser, token): try: tag_name, as_, var_name = token.contents.split() except ValueError: raise template.TemplateSyntaxError, 'Invalid syntax for %s node: %s' % (cls.__name__, token.contents) return cls(tag_name, var_name) return _func class SimpleAssignmentNode(template.Node): def __init__(self, tag_name, var_name): self.tag_name = tag_name self.var_name = var_name def render(self, context): self.render_context = context context[self.var_name] = self.what() return '' def do_simple_assignment_node_with_var_helper(cls): def _func(parser, token): try: tag_name, of_, in_var_name, as_, var_name = token.contents.split() except ValueError: raise template.TemplateSyntaxError, 'Invalid syntax for %s node: %s' % (cls.__name__, token.contents) return cls(tag_name, in_var_name, var_name) return _func class SimpleAssignmentNodeWithVar(template.Node): def __init__(self, tag_name, in_var_name, var_name): self.tag_name = tag_name self.in_var = template.Variable(in_var_name) self.var_name = var_name def render(self, context): self.render_context = context try: instance = self.in_var.resolve(context) except template.VariableDoesNotExist: context[self.var_name] = [] return '' context[self.var_name] = self.what(instance) return '' def do_simple_assignment_node_with_var_and_args_helper(cls): def _func(parser, token): try: tag_name, of_, in_var_name, as_, var_name, args = token.contents.split() except ValueError: try: tag_name, of_, in_var_name, as_, var_name = token.contents.split() args = '' except ValueError: raise template.TemplateSyntaxError, 'Invalid syntax for %s node: %s' % (cls.__name__, token.contents) return cls(tag_name, in_var_name, var_name, args) return _func class SimpleAssignmentNodeWithVarAndArgs(template.Node): def __init__(self, tag_name, in_var_name, var_name, args): self.tag_name = tag_name self.in_var = template.Variable(in_var_name) self.var_name = var_name self.args = args def render(self, context): self.render_context = context try: instance = self.in_var.resolve(context) except template.VariableDoesNotExist: context[self.var_name] = [] return '' context[self.var_name] = self.what(instance, _parse_args(self.args, context)) return '' �����������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0015733�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/__init__.py�������������������������������������������������������������0000664�0000000�0000000�00000000000�12122555434�0020032�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/cbv/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0016505�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/cbv/__init__.py���������������������������������������������������������0000664�0000000�0000000�00000000000�12122555434�0020604�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/cbv/urls.py�������������������������������������������������������������0000664�0000000�0000000�00000000415�12122555434�0020044�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from __future__ import absolute_import from django.conf.urls import patterns, url from .views import Handler handler = Handler.as_view() urlpatterns = patterns('', url(r'^$', handler, name='feincms_home'), url(r'^(.*)/$', handler, name='feincms_handler'), ) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/cbv/views.py������������������������������������������������������������0000664�0000000�0000000�00000002355�12122555434�0020221�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.db.models import get_model from django.http import Http404 from feincms import settings from feincms.module.mixins import ContentView class Handler(ContentView): page_model_path = 'page.Page' context_object_name = 'feincms_page' @property def page_model(self): if not hasattr(self, '_page_model'): self._page_model = get_model(*self.page_model_path.split('.')) return self._page_model def get_object(self): return self.page_model._default_manager.for_request( self.request, raise404=True, best_match=True, setup=False) def dispatch(self, request, *args, **kwargs): try: return super(Handler, self).dispatch(request, *args, **kwargs) except Http404, e: if settings.FEINCMS_CMS_404_PAGE: try: request.original_path_info = request.path_info request.path_info = settings.FEINCMS_CMS_404_PAGE response = super(Handler, self).dispatch(request, *args, **kwargs) response.status_code = 404 return response except Http404: raise e else: raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/decorators.py�����������������������������������������������������������0000664�0000000�0000000�00000003073�12122555434�0020455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.http import HttpResponse try: from functools import wraps except ImportError: from django.utils.functional import wraps from feincms.module.page.models import Page def add_page_to_extra_context(view_func): """ Adds the best-match page to the extra_context keyword argument. Mainly used to provide generic views which integrate into the page module. """ def inner(request, *args, **kwargs): import warnings warnings.warn("The `add_page_to_extra_context` view decorator has been" " deprecated, as have the function-based generic views in" " `django.views.generic` and `feincms.views.generic`. Use the" " `feincms.context_processors.add_page_if_missing` context processor" " and Django's class-based generic views instead.", DeprecationWarning, stacklevel=2) kwargs.setdefault('extra_context', {}) kwargs['extra_context']['feincms_page'] = Page.objects.for_request( request, best_match=True) return view_func(request, *args, **kwargs) return wraps(view_func)(inner) def standalone(view_func): """ Marks the view method as standalone view; this means that ``HttpResponse`` objects returned from ``ApplicationContent`` are returned directly, without further processing. """ def inner(request, *args, **kwargs): response = view_func(request, *args, **kwargs) if isinstance(response, HttpResponse): response.standalone = True return response return wraps(view_func)(inner) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/generic/����������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0017347�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/generic/__init__.py�����������������������������������������������������0000664�0000000�0000000�00000000000�12122555434�0021446�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/generic/create_update.py������������������������������������������������0000664�0000000�0000000�00000000505�12122555434�0022526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.views.generic import create_update from feincms.views.decorators import add_page_to_extra_context create_object = add_page_to_extra_context(create_update.create_object) update_object = add_page_to_extra_context(create_update.update_object) delete_object = add_page_to_extra_context(create_update.delete_object) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/generic/date_based.py���������������������������������������������������0000664�0000000�0000000�00000001101�12122555434�0021765�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.views.generic import date_based from feincms.views.decorators import add_page_to_extra_context archive_index = add_page_to_extra_context(date_based.archive_index) archive_year = add_page_to_extra_context(date_based.archive_year) archive_month = add_page_to_extra_context(date_based.archive_month) archive_week = add_page_to_extra_context(date_based.archive_week) archive_day = add_page_to_extra_context(date_based.archive_day) archive_today = add_page_to_extra_context(date_based.archive_today) object_detail = add_page_to_extra_context(date_based.object_detail) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/generic/list_detail.py��������������������������������������������������0000664�0000000�0000000�00000000364�12122555434�0022221�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.views.generic import list_detail from feincms.views.decorators import add_page_to_extra_context object_list = add_page_to_extra_context(list_detail.object_list) object_detail = add_page_to_extra_context(list_detail.object_detail) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/feincms/views/generic/simple.py�������������������������������������������������������0000664�0000000�0000000�00000000263�12122555434�0021213�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.views.generic import simple from feincms.views.decorators import add_page_to_extra_context direct_to_template = add_page_to_extra_context(simple.direct_to_template) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/quickstart.sh�������������������������������������������������������������������������0000775�0000000�0000000�00000001241�12122555434�0015701�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # This script downloads all the software needed to run FeinCMS # echo "Downloading Django and django-mptt via git... (this will take some time)" mkdir lib cd lib git clone git://github.com/django/django.git git clone git://github.com/django-mptt/django-mptt.git cd .. ln -s lib/django/django django ln -s lib/django-mptt/mptt mptt cat <<EOD Everything should be ready now. Type the following commands into the shell to start the test server: cd example python manage.py runserver Navigate to http://127.0.0.1:8000/admin/ to see the admin interface. The username is 'admin', the password 'password'. You are probably most interested in the page module. EOD ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/requirements.txt����������������������������������������������������������������������0000664�0000000�0000000�00000000115�12122555434�0016433�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Django>=1.4 django-mptt>=0.4 PIL feedparser>=5.1.2 lxml BeautifulSoup>=3.1.2 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/setup.py������������������������������������������������������������������������������0000775�0000000�0000000�00000002133�12122555434�0014666�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python from distutils.core import setup import os import setuplib packages, package_data = setuplib.find_packages('feincms') setup(name='FeinCMS', version=__import__('feincms').__version__, description='Django-based Page CMS and CMS building toolkit.', long_description=open(os.path.join(os.path.dirname(__file__), 'README.rst')).read(), author='Matthias Kestenholz', author_email='mk@feinheit.ch', url='http://github.com/feincms/feincms/', license='BSD License', platforms=['OS Independent'], packages=packages, package_data=package_data, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', 'Framework :: Django', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 'Topic :: Software Development', 'Topic :: Software Development :: Libraries :: Application Frameworks', ], ) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/setuplib.py���������������������������������������������������������������������������0000664�0000000�0000000�00000003517�12122555434�0015361�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import os __all__ = ['find_files'] def fullsplit(path, result=None): """ Split a pathname into components (the opposite of os.path.join) in a platform-neutral way. """ if result is None: result = [] head, tail = os.path.split(path) if head == '': return [tail] + result if head == path: return result return fullsplit(head, [tail] + result) def find_packages(package_dir): """ Returns a tuple consisting of a ``packages`` list and a ``package_data`` dictionary suitable for passing on to ``distutils.core.setup`` Requires the folder name containing the package files; ``find_files`` assumes that ``setup.py`` is located in the same folder as the folder containing those files. Code lifted from Django's ``setup.py``, with improvements by PSyton. """ # Compile the list of packages available, because distutils doesn't have # an easy way to do this. packages = [] package_data = {} root_dir = os.path.dirname(__file__) if root_dir != '': os.chdir(root_dir) for dirpath, dirnames, filenames in sorted(os.walk(package_dir)): # Ignore dirnames that start with '.' for i, dirname in enumerate(dirnames): if dirname.startswith('.'): del dirnames[i] if '__init__.py' in filenames: packages.append('.'.join(fullsplit(dirpath))) elif filenames: cur_pack = packages[0] # Assign all data files to the toplevel package if cur_pack not in package_data: package_data[cur_pack] = [] package_dir = os.path.join(*cur_pack.split(".")) dir_relpath = os.path.relpath(dirpath, package_dir) for f in filenames: package_data[cur_pack].append(os.path.join(dir_relpath, f)) return packages, package_data ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/��������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0014314�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/cov.sh��������������������������������������������������������������������������0000775�0000000�0000000�00000000117�12122555434�0015441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh coverage run --branch --include="*feincms*" ./manage.py test feincms �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/manage.py�����������������������������������������������������������������������0000775�0000000�0000000�00000000575�12122555434�0016130�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import os, sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testapp.settings") os.environ.setdefault("FEINCMS_RUN_TESTS", "1") sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) �����������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0015774�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/__init__.py�������������������������������������������������������������0000664�0000000�0000000�00000000001�12122555434�0020074�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/applicationcontent_urls.py����������������������������������������������0000664�0000000�0000000�00000004563�12122555434�0023321�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" This is a dummy module used to test the ApplicationContent """ from django import template from django.conf.urls import patterns, include, url from django.http import HttpResponse, HttpResponseRedirect from feincms.views.decorators import standalone def module_root(request): return 'module_root' def args_test(request, kwarg1, kwarg2): return HttpResponse(u'%s-%s' % (kwarg1, kwarg2)) def full_reverse_test(request): t = template.Template('{% load applicationcontent_tags %}{% load url from future %}home:{% app_reverse "ac_module_root" "testapp.applicationcontent_urls" %} args:{% app_reverse "ac_args_test" "testapp.applicationcontent_urls" "xy" "zzy" %} base:{% url "feincms_handler" "test" %} homeas:{% app_reverse "ac_module_root" "testapp.applicationcontent_urls" as reversed %}{{ reversed }}') return t.render(template.Context()) def alias_reverse_test(request): t = template.Template('{% load applicationcontent_tags %}{% load url from future %}home:{% app_reverse "ac_module_root" "whatever" %} args:{% app_reverse "ac_args_test" "whatever" "xy" "zzy" %} base:{% url "feincms_handler" "test" %}') return t.render(template.Context()) def fragment(request): t = template.Template('{% load applicationcontent_tags %}{% fragment request "something" %}some things{% endfragment %}') return t.render(template.Context({'request': request})) def redirect(request): return HttpResponseRedirect('../') def response(request): return HttpResponse('Anything') def inheritance20(request): return template.Template(''' {% extends "base.html" %} some content outside {% block content %}a content {{ from_appcontent }}{% endblock %} {% block sidebar %}b content {{ block.super }}{% block bla %}{% endblock %}{% endblock %} '''), {'from_appcontent': 42} urlpatterns = patterns('', url(r'^$', module_root, name='ac_module_root'), url(r'^args_test/([^/]+)/([^/]+)/$', args_test, name='ac_args_test'), url(r'^kwargs_test/(?P<kwarg2>[^/]+)/(?P<kwarg1>[^/]+)/$', args_test), url(r'^full_reverse_test/$', full_reverse_test), url(r'^alias_reverse_test/$', alias_reverse_test), url(r'^fragment/$', fragment), url(r'^redirect/$', redirect), url(r'^response/$', response), url(r'^response_decorated/$', standalone(response)), url(r'^inheritance20/$', inheritance20), ) ���������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/blog_urls.py������������������������������������������������������������0000664�0000000�0000000�00000000630�12122555434�0020335�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django.conf.urls import patterns, include, url from django.views import generic from feincms.module.blog.models import Entry urlpatterns = patterns('', url(r'^(?P<pk>\d+)/', generic.DetailView.as_view( queryset=Entry.objects.all(), ), name='blog_entry_details'), url(r'^$', generic.ListView.as_view( queryset=Entry.objects.all(), ), name='blog_entry_list'), ) ��������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/media/������������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0017053�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/media/.gitignore��������������������������������������������������������0000664�0000000�0000000�00000000002�12122555434�0021033�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������* ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/media/somefile.jpg������������������������������������������������������0000664�0000000�0000000�00000000651�12122555434�0021362�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF������C�       � ������������������� �#����������� "���?�e/N;٬dS$QgbB1Bw@ +MdW̼{$ړW2n8lDІp9\ˏ !M "j*ƲW0�艌*&NӬ=ieZp1<ijk19"]"$l`"H8~6n!B 52Siv4&W"cp1cuß���������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/models.py���������������������������������������������������������������0000664�0000000�0000000�00000006061�12122555434�0017634�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from django import forms from django.db import models from django.utils.text import capfirst from django.utils.translation import ugettext_lazy as _ from feincms.module.blog.models import Entry, EntryAdmin from feincms.module.page.models import Page from feincms.content.raw.models import RawContent from feincms.content.image.models import ImageContent from feincms.content.medialibrary.models import MediaFileContent from feincms.content.application.models import ApplicationContent from feincms.module.page.extensions.navigation import NavigationExtension, PagePretender from feincms.content.application.models import reverse from mptt.models import MPTTModel Page.register_templates({ 'key': 'base', 'title': 'Base Template', 'path': 'base.html', 'regions': ( ('main', 'Main region'), ('sidebar', 'Sidebar', 'inherited'), ), }) Page.create_content_type(RawContent) Page.create_content_type(MediaFileContent, TYPE_CHOICES=( ('default', 'Default position'), )) Page.create_content_type(ImageContent, POSITION_CHOICES=( ('default', 'Default position'), )) def get_admin_fields(form, *args, **kwargs): return { 'exclusive_subpages': forms.BooleanField( label=capfirst(_('exclusive subpages')), required=False, initial=form.instance.parameters.get('exclusive_subpages', False), help_text=_('Exclude everything other than the application\'s content when rendering subpages.'), ), } Page.create_content_type(ApplicationContent, APPLICATIONS=( ('testapp.blog_urls', 'Blog', {'admin_fields': get_admin_fields}), ('whatever', 'Test Urls', {'urls': 'testapp.applicationcontent_urls'}), )) Entry.register_regions( ('main', 'Main region'), ) Entry.create_content_type(RawContent) Entry.create_content_type(ImageContent, POSITION_CHOICES=( ('default', 'Default position'), )) class BlogEntriesNavigationExtension(NavigationExtension): """ Extended navigation for blog entries. It would be added to 'Blog' page properties in admin. """ name = _('all blog entries') def children(self, page, **kwargs): for entry in Entry.objects.all(): yield PagePretender( title=entry.title, url=reverse('testapp.blog_urls/blog_entry_details', kwargs={'object_id': entry.id}), ) Page.register_extensions( 'feincms.module.page.extensions.navigation', 'feincms.module.page.extensions.sites', ) class Category(MPTTModel): name = models.CharField(max_length=20) slug = models.SlugField() parent = models.ForeignKey('self', blank=True, null=True, related_name='children') class Meta: ordering = ['tree_id', 'lft'] verbose_name = 'category' verbose_name_plural = 'categories' def __unicode__(self): return self.name # add m2m field to entry so it shows up in entry admin Entry.add_to_class('categories', models.ManyToManyField(Category, blank=True, null=True)) EntryAdmin.list_filter += ('categories',) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/navigation_extensions.py������������������������������������������������0000664�0000000�0000000�00000001012�12122555434�0022756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from feincms.module.page.extensions.navigation import NavigationExtension, PagePretender class PassthroughExtension(NavigationExtension): # See PagesTestCase.test_23_navigation_extension name = 'passthrough extension' def children(self, page, **kwargs): for p in page.children.in_navigation(): yield p class PretenderExtension(NavigationExtension): name = 'pretender extension' def children(self, page, **kwargs): return [PagePretender(title='blabla', url='/asdsa/')] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/settings.py�������������������������������������������������������������0000664�0000000�0000000�00000002157�12122555434�0020213�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import os SITE_ID = 1 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', } } INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.admin', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sitemaps', 'django.contrib.sites', 'django.contrib.staticfiles', 'feincms', 'feincms.module.blog', 'feincms.module.medialibrary', 'feincms.module.page', 'mptt', 'testapp', ] MEDIA_ROOT = '/media/' STATIC_URL = '/static/' BASEDIR = os.path.dirname(__file__) MEDIA_ROOT = os.path.join(BASEDIR, 'media/') STATIC_ROOT = os.path.join(BASEDIR, 'static/') SECRET_KEY = 'supersikret' ROOT_URLCONF = 'testapp.urls' LANGUAGES = (('en', 'English'), ('de', 'German')) TEMPLATE_CONTEXT_PROCESSORS = ( 'django.contrib.auth.context_processors.auth', 'django.core.context_processors.debug', 'django.core.context_processors.i18n', 'django.core.context_processors.media', 'django.core.context_processors.static', 'django.core.context_processors.request', # request context processor is needed ) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/templates/��������������������������������������������������������������0000775�0000000�0000000�00000000000�12122555434�0017772�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/templates/404.html������������������������������������������������������0000664�0000000�0000000�00000000030�12122555434�0021160�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<h1>Page not found</h1> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������feincms-1.7.4/tests/testapp/templates/base.html�����������������������������������������������������0000664�0000000�0000000�00000002441�12122555434�0021573�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% load applicationcontent_tags feincms_tags feincms_page_tags %} <html> <head> <title>{{ feincms_page.title }}

    {{ feincms_page.title }}

    Main content

    {% block content %}{% feincms_render_region feincms_page "main" request %}{% endblock %}
    {% feincms_frontend_editing feincms_page request %} {% get_fragment request "something" %} feincms-1.7.4/tests/testapp/templates/feincms_base.html000066400000000000000000000000001212255543400232640ustar00rootroot00000000000000feincms-1.7.4/tests/testapp/urls.py000066400000000000000000000013501212255543400173320ustar00rootroot00000000000000import os from django.conf.urls import patterns, include, url from django.contrib import admin from django.contrib.staticfiles.urls import staticfiles_urlpatterns from feincms.module.page.sitemap import PageSitemap sitemaps = {'pages' : PageSitemap} admin.autodiscover() urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': os.path.join(os.path.dirname(__file__), 'media/')}), url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}), url(r'', include('feincms.contrib.preview.urls')), url(r'', include('feincms.views.cbv.urls')), ) urlpatterns += staticfiles_urlpatterns() feincms-1.7.4/tests/tox.ini000066400000000000000000000011241212255543400156250ustar00rootroot00000000000000[tox] setupdir = .. distribute = False envlist = py25-1.4.X, py26-1.4.X, py27-1.4.X, [testenv] downloadcache = {toxworkdir}/_download/ commands = {envbindir}/django-admin.py test {posargs:tests} --settings=tests.settings setenv = PYTHONPATH = {toxworkdir}/../.. [testenv:py25-1.4.X] basepython = python2.5 deps = django==1.4 PIL==1.1.7 feedparser lxml [testenv:py26-1.4.X] basepython = python2.6 deps = django==1.4 PIL==1.1.7 feedparser lxml [testenv:py27-1.4.X] basepython = python2.7 deps = django==1.4 PIL==1.1.7 feedparser lxml