{ "info": { "author": "Andriy Mylenkyy", "author_email": "support@quintagroup.com", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "qplone3 theme template\r\n======================\r\n\r\nquintagroup.themetemplate is an enhanced \"Plone 3 Theme\" template from Zopeskel, \r\nthat includes addcontent local command, which allows you to extend base Plone theme\r\nby additional elements, such as: skin layers, portlets, viewlets, css and js resources, \r\nand objects in zexp files. This package is an analogue of Archetype template in terms \r\nof its functionality.\r\n\r\nquintagroup.themetemplate package is used for development of all Quintagroup themes \r\nfor Plone 3 at http://skins.quintagroup.com.\r\n\r\n`Plone Themes by Quintagroup `_, 2006-2012\r\n\r\nContents\r\n--------\r\n1. Overview\r\n2. Creating theme package\r\n3. Extending theme\r\n4. Release notes\r\n\r\nOverview\r\n========\r\n\r\nThis theme template allows you to create initial theme package skeleton,\r\ni.e. create plone3 theme python package with nested namespace (this is different from \r\ndeafult plone3_theme template in Zopeskel) \r\n\r\nAfter that you can extend theme package by the following elements:\r\n\r\n- skin-layer(s)\r\n- portlet(s)\r\n- viewlet(s)\r\n- css, js resource(s)\r\n- objects in zexp files\r\n\r\nCreation of a package is performed with *paster create* PasteScript command.\r\nTheme extending with other resources can be done with *paster addcontent*\r\nlocal ZopeSkel command (extended in this product).\r\n\r\nCreating theme package\r\n======================\r\n\r\nLet's create plone-3 theme python package.\r\nUse `paster create` command for that::\r\n\r\n >>> paster('create -t qplone3_theme quintagroup.theme.example --no-interactive --overwrite')\r\n paster create -t qplone3_theme quintagroup.theme.example --no-interactive\r\n ...\r\n\r\nYou got standard python package content with\r\n\r\n- *quintagroup* upper level namespace.\r\n- *quintagroup.theme.example-configure.zcml* - zcml file for adding into package-includes directory\r\n\r\nCheck that::\r\n\r\n >>> package_dir = 'quintagroup.theme.example'\r\n >>> objects = ['setup.py', 'quintagroup', 'quintagroup.theme.example-configure.zcml']\r\n >>> objects.sort()\r\n >>> [o for o in objects if o in os.listdir(package_dir)]\r\n ['quintagroup', 'quintagroup.theme.example-configure.zcml', 'setup.py']\r\n\r\n\r\n*qplone3_theme* template - creates theme with nested namespace.\r\n\r\nBy default - theme is placed in *quintagroup.theme.<3rd part of dotted package name> namespace*\r\n\r\nin our case - quintagroup.theme.example\r\n\r\nSo check namespaces::\r\n\r\n >>> theme_namespace = os.path.join(package_dir,'quintagroup','theme','example')\r\n >>> os.path.isdir(theme_namespace)\r\n True\r\n\r\nTheme holds 3 subdirectories (browser, profiles, skins)::\r\n\r\n >>> cd(theme_namespace)\r\n >>> dirs = ('skins', 'browser', 'profiles')\r\n >>> [True for d in dirs if d in os.listdir('.')]\r\n [True, True, True]\r\n\r\nAnd initialization files (__init__.py, configure.zcml) ::\r\n\r\n >>> files = ('__init__.py', 'configure.zcml')\r\n >>> [True for d in files if d in os.listdir('.')]\r\n [True, True]\r\n \r\n\r\n*browser* directory\r\n-------------------\r\n\r\nBrowser directory contains:\r\n\r\n- 'templates' resource directory\r\n- interfaces.py module with IThemeSpecific marker interface\r\n- configure.zcml, with registered theme marker interface::\r\n\r\n >>> ls('browser')\r\n __init__.py\r\n configure.zcml\r\n interfaces.py\r\n templates\r\n\r\n >>> cat('browser/interfaces.py')\r\n from plone.theme.interfaces import IDefaultPloneLayer\r\n \r\n class IThemeSpecific(IDefaultPloneLayer):\r\n ...\r\n\r\n >>> cat('browser/configure.zcml')\r\n \r\n ...\r\n\r\nAs we see, default theme name is 'Custom Theme', but on theme\r\ncreation you can point out your own name. Check this ...\r\n\r\nFirst create configuration file with different skin name::\r\n\r\n >>> conf_data = \"\"\"\r\n ... [pastescript]\r\n ... skinname=My Theme Name\r\n ... \"\"\"\r\n >>> file('theme_config.conf','w').write(conf_data)\r\n\r\nCreate the same theme with your own skin name and check this::\r\n\r\n >>> paster('create -t qplone3_theme quintagroup.theme.example --no-interactive --overwrite --config=theme_config.conf')\r\n paster create ...\r\n >>> cd(package_dir)\r\n >>> cat('quintagroup/theme/example/browser/configure.zcml')\r\n \r\n ...\r\n\r\n\r\n*skins* directory\r\n-----------------\r\n\r\nIt contains only README.txt file and NO SKIN LAYERS YET.\r\nThis is a job for localcommand ;)\r\n\r\nBut check whether I am right ...::\r\n\r\n >>> cd('quintagroup/theme/example')\r\n >>> ls('skins')\r\n README.txt\r\n\r\n\r\n*profiles* directory\r\n--------------------\r\n\r\nThere is 'default' and uninstall profiles inside::\r\n\r\n >>> 'default' in os.listdir('profiles')\r\n True\r\n >>> 'uninstall' in os.listdir('profiles')\r\n True\r\n\r\nThere are the following items in default profile:\r\n\r\n- import_steps.xml - for any reason.\r\n- skins.xml - for registering skins directory::\r\n\r\n >>> cd('profiles/default')\r\n >>> 'import_steps.xml' in os.listdir('.')\r\n True\r\n >>> 'skins.xml' in os.listdir('.')\r\n True\r\n\r\n*skins.xml* profile makes your theme default on installation\r\nand uses layers list from 'Plone Default' for our theme,\r\nwithout any new layers (yet)::\r\n\r\n >>> cat('skins.xml')\r\n \r\n ...\r\n \r\n ...\r\n \r\n \r\n \r\n \r\n ...\r\n\r\n*import_steps.xml* - call _setupVarious_ function from\r\n_setuphandlers.py_ module for additional installation steps::\r\n\r\n >>> cat('import_steps.xml')\r\n \r\n ...\r\n \r\n ...\r\n\r\nLook at setuphandlers.py module::\r\n\r\n >>> cd('../..')\r\n >>> cat('setuphandlers.py')\r\n def setupVarious(context):\r\n ...\r\n\r\n\r\nExtending theme\r\n===============\r\n\r\nOne of the best features, which ZopeSkel package brings, is *localcommand*.\r\n\r\nThis part shows how you can extend a theme (generated with qplone3_theme\r\nZopeSkel template) with additional useful stuff:\r\n\r\n- skin layers\r\n- views\r\n- viewlets\r\n- portlets\r\n- css\r\n- javascripts\r\n- objects in zexp files\r\n\r\nSo, in qplone3_theme generated package you can use *addcontent* ZopeSkel\r\nlocal command.\r\n\r\nIMPORTANT TO NOTE: localcommand (addcontent in our case) should be\r\ncalled in any subdirectory of the generated theme package. And it won't\r\nwork outside this package::\r\n\r\n >>> paster('addcontent -a')\r\n paster addcontent -a\r\n ...\r\n css_dtml_skin: A DTML file in skin layer with CSS registration\r\n css_resource: A Plone 3 CSS resource template\r\n ...\r\n import_zexps: A template for importing zexp-objects into portal on installation\r\n js_resource: A Plone 3 JS resource template\r\n N portlet: A Plone 3 portlet\r\n ...\r\n skin_layer: A Plone 3 Skin Layer\r\n ...\r\n N view: A browser view skeleton\r\n viewlet_hidden: A Plone 3 Hidden Viewlet template\r\n viewlet_order: A Plone 3 Order Viewlet template\r\n ...\r\n\r\n\r\nWe can see a list of extention subtemplates, which can be used for our theme.\r\n'N' character tells us that these subtemplates are registered for other (archetype)\r\ntemplate, but it does not matter - they can correctly extend our theme.\r\n\r\n\r\nAdding SKIN LAYER\r\n=================\r\n\r\nFor that case use *skin_layer* subtemplate with *addcontent* local command::\r\n\r\n >>> paster('addcontent --no-interactive skin_layer')\r\n paster addcontent --no-interactive skin_layer\r\n Recursing into profiles\r\n ...\r\n\r\nThis command adds NEW 'skin_layer' (default name) directory to _skins_ directory,\r\nwith only CONTENT.txt file inside::\r\n\r\n >>> 'skin_layer' in os.listdir('skins')\r\n True\r\n >>> ls('skins/skin_layer')\r\n CONTENT.txt\r\n\r\n*skins.xml* profile is also updated::\r\n\r\n >>> cat('profiles/default/skins.xml')\r\n \r\n ...\r\n \r\n ...\r\n \r\n ...\r\n \r\n ...\r\n \r\n \r\n \r\n ...\r\n\r\nWe can see, that: \r\n\r\n- skin_layer directory was registered as Filesystem Directory View\r\n- skin_layer Filesystem Directory View was added to our theme layers list\r\n\r\n\r\nAdding PORTLET\r\n==============\r\n\r\nOnly initialization files are available in portlets directory before adding new portlet::\r\n\r\n >>> ls('portlets')\r\n __init__.py\r\n configure.zcml\r\n\r\nAdd portlet with *portlet* subtemplate::\r\n\r\n >>> paster('addcontent --no-interactive portlet')\r\n paster addcontent --no-interactive portlet\r\n ...\r\n Recursing into portlets\r\n ...\r\n\r\nAfter executing this local command ...\r\n\r\nconfigure.zcml file in the theme root directory - includes portlets registry::\r\n\r\n >>> cat('configure.zcml')\r\n \r\n ...\r\n\r\nexampleportlet.pt template and exampleportlet.py script added to portlets directory::\r\n \r\n >>> files = ('exampleportlet.pt', 'exampleportlet.py')\r\n >>> [True for d in files if d in os.listdir('portlets')]\r\n [True, True]\r\n\r\nAnd portlets/configure.zcml - register new portlet::\r\n\r\n >>> cat('portlets/configure.zcml')\r\n \r\n ...\r\n\r\nFinally, new portlet type is registered in portlets.xml profile::\r\n\r\n >>> cat('profiles/default/portlets.xml')\r\n \r\n ...\r\n \r\n ...\r\n\r\nThanks to ZopeSkel developers for this subtempalte ;)\r\n\r\n\r\nAdding CSS resource\r\n===================\r\n\r\nUse *css_resource* subtemplate::\r\n\r\n >>> paster(\"addcontent --no-interactive css_resource\")\r\n paster addcontent --no-interactive css_resource\r\n Recursing into browser\r\n ...\r\n Recursing into profiles\r\n ...\r\n\r\nThis template adds (if does not exist yet) _stylesheets_ directory in _browser_\r\ndirectory::\r\n\r\n >>> 'stylesheets' in os.listdir('browser')\r\n True\r\n\r\nIn _stylesheets_ resource directory empty main.css stylesheet\r\nresource added::\r\n\r\n >>> 'main.css' in os.listdir('browser/stylesheets')\r\n True\r\n >>> cat('browser/stylesheets/main.css')\r\n \r\n\r\n\r\nNew resource directory was registered in configure.zcml::\r\n\r\n >>> cat('browser/configure.zcml')\r\n \r\n ...\r\n \r\n\r\nAnd cssregistry.xml profile was added into profiles/default directory with\r\nregistered main.css stylesheet::\r\n\r\n >>> 'cssregistry.xml' in os.listdir('profiles/default')\r\n True\r\n >>> cat('profiles/default/cssregistry.xml')\r\n \r\n \r\n \r\n \r\n ...\r\n\r\n\r\n\r\nAdding CSS resource as dtml-file into skins layer\r\n=================================================\r\n\r\nThis template actually absolutely same to the previouse one, but layer_name\r\nvariable added to point in which skin layer css dtml-file should be added to.\r\nAnd, of course, css resource added into pointing *skins//.dtml* file.\r\n\r\nThis subtemplate has several benefits before registering css as resource layer:\r\n\r\n- in dtml file you can use power of dtml language\r\n- this resource can be overriden by customer if he needs that\r\n\r\nIMPORTANT:\r\nFor add css resource in registered skin layer - you should use this subtemplate\r\nin conjunction with *skin_layer* one.\r\n\r\n\r\nUse *css_dtml_skin* subtemplate::\r\n\r\n >>> paster(\"addcontent --no-interactive css_dtml_skin\")\r\n paster addcontent --no-interactive css_dtml_skin\r\n Recursing into profiles\r\n ...\r\n Recursing into skins\r\n ...\r\n\r\nThis template adds main.css.dtml file into skins/skin_layer folder::\r\n\r\n >>> 'main.css.dtml' in os.listdir('skins/skin_layer')\r\n True\r\n\r\nThe main.css.dtml file already prepared to use as dtml-document::\r\n\r\n >>> cat('skins/skin_layer/main.css.dtml')\r\n /*\r\n ...\r\n /* (do not remove this :) */\r\n ...\r\n /* */\r\n \r\n \r\n\r\nAnd cssregistry.xml profile was added into profiles/default directory with\r\nregistered main.css stylesheet::\r\n\r\n >>> 'cssregistry.xml' in os.listdir('profiles/default')\r\n True\r\n >>> cat('profiles/default/cssregistry.xml')\r\n \r\n \r\n \r\n \r\n ...\r\n\r\n\r\nAdding JAVASCRIPT resource\r\n--------------------------\r\n\r\nUse *js_resource* subtemplate::\r\n\r\n >>> paster('addcontent --no-interactive js_resource')\r\n paster addcontent --no-interactive js_resource\r\n Recursing into browser\r\n ...\r\n Recursing into profiles\r\n ...\r\n\r\nThis template adds (if does not exist yet) _scripts_ directory in _browser_\r\ndirectory::\r\n\r\n >>> 'scripts' in os.listdir('browser')\r\n True\r\n\r\n\r\nEmpty foo.js javascript file was added to _scripts_ directory::\r\n\r\n >>> 'foo.js' in os.listdir('browser/scripts')\r\n True\r\n >>> cat('browser/scripts/foo.js')\r\n \r\n\r\n\r\nNew resource directory was registered in configure.zcml, if has not been registered yet::\r\n\r\n >>> cat('browser/configure.zcml')\r\n \r\n ...\r\n \r\n\r\ncssregistry.xml profile was added into profiles/default directory (if does not exist yet),\r\nand register new foo.js javascript resource::\r\n\r\n >>> 'jsregistry.xml' in os.listdir('profiles/default')\r\n True\r\n >>> cat('profiles/default/jsregistry.xml')\r\n \r\n \r\n ...\r\n \r\n ...\r\n\r\n\r\n\r\nTest viewlets subtemplates\r\n==========================\r\n\r\nThere are 2 types of viewlet subtemplates:\r\n\r\n- viewlet_order\r\n- viewlet_hidden\r\n\r\nThe first one is used for adding new viewlets and setting \r\nviewlets order for the ViewletManager, the second one only hides\r\nviewlet in pointed ViewletManager.\r\n\r\nOrdered NEW viewlet\r\n-------------------\r\n\r\nUse *viewlet_order* subtemplate::\r\n\r\n >>> paster('addcontent --no-interactive viewlet_order')\r\n paster addcontent --no-interactive viewlet_order\r\n Recursing into browser\r\n ...\r\n Recursing into templates\r\n ...\r\n Recursing into profiles\r\n ...\r\n\r\nThis template adds (if not exist ;)) _viewlets.py_ module in browser directory.\r\nWith added Example ViewletBase class, which is bound to templates/example_viewlet.pt\r\ntemplate::\r\n\r\n >>> 'viewlets.py' in os.listdir('browser')\r\n True\r\n \r\n >>> cat('browser/viewlets.py')\r\n from Products.CMFCore.utils import getToolByName\r\n from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile\r\n from plone.app.layout.viewlets import common\r\n ...\r\n class Example(common.ViewletBase):\r\n render = ViewPageTemplateFile('templates/example_viewlet.pt')\r\n \r\n\r\nCheck template file in templates directory::\r\n\r\n >>> 'example_viewlet.pt' in os.listdir('browser/templates')\r\n True\r\n >>> cat('browser/templates/example_viewlet.pt')\r\n \r\n\r\nNew viewlet is registered in configure.zcml::\r\n\r\n >>> cat('browser/configure.zcml')\r\n \r\n ...\r\n \r\n\r\nviewlets.xml profile is added to profiles/default directory with new viewlet \r\nregistration, ordered for specified viewlet manager::\r\n\r\n >>> 'viewlets.xml' in os.listdir('profiles/default')\r\n True\r\n >>> cat('profiles/default/viewlets.xml')\r\n \r\n \r\n ...\r\n \r\n ...\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\nHide EXISTING viewlet\r\n---------------------\r\n\r\nFor that case you can use *viewlet_hidden* subtemplate::\r\n\r\n >>> paster('addcontent --no-interactive viewlet_hidden')\r\n paster addcontent --no-interactive viewlet_hidden\r\n Recursing into profiles\r\n ...\r\n\r\nAs we see from upper log - there is stuff for adding/updating profiles only.\r\n \r\n\r\nThere is viewlet.xml profile in profiles/default directory\r\nwhich hides viewlet for specified viewlet manager::\r\n\r\n >>> 'viewlets.xml' in os.listdir('profiles/default')\r\n True\r\n >>> cat('profiles/default/viewlets.xml')\r\n \r\n \r\n ...\r\n \r\n ...\r\n \r\n \r\n \r\n ...\r\n \r\n\r\n\r\nAdding ZEXPs importing\r\n======================\r\n\r\nImagine situation, when you develop a theme, which uses some \r\nextra portal objects (documents with text for some potlets)\r\nThen customer of your theme can edit these objects according\r\nto his need.\r\n\r\nFor this situation *import_zexps* subtemplate exists.\r\n\r\n*import_zexps* subtemplate extends your theme with\r\nmechanism for importing list of zexp formated files\r\ninto portal root on theme instllation::\r\n\r\n >>> paster('addcontent --no-interactive import_zexps')\r\n paster addcontent --no-interactive import_zexps\r\n ...\r\n Recursing into import\r\n ...\r\n Recursing into profiles\r\n ...\r\n Inserting from profiles.zcml_insert ...\r\n ...\r\n Inserting from setuphandlers.py_insert into ...\r\n ...\r\n\r\nAs we see from the upper log\r\n\r\n- 'import' directory was added into root of the theme\r\n- profiles stuff was updated\r\n- profiles.zcml file is updated\r\n- some stuff into setuphandlers.py module was inserted\r\n \r\n1. There was empty 'import' directory added, where you\r\n will put zexp objects for install into portal root.::\r\n\r\n >>> ls('import')\r\n CONTENT.txt\r\n\r\n\r\n2. import_steps.xml was added in profiles/import_zexps directory,\r\n which contains additional *quintagroup.theme.example.import_zexps* step::\r\n\r\n >>> 'import_zexps' in os.listdir('profiles')\r\n True\r\n >>> 'import_steps.xml' in os.listdir('profiles/import_zexps')\r\n True\r\n\r\n >>> cat('profiles/import_zexps/import_steps.xml')\r\n \r\n ...\r\n \r\n Import zexp objects into portal on My Theme Name theme installation\r\n \r\n \r\n ...\r\n\r\n3. profiles.zcml configuration updated with new genericsetup profile for zexps\r\n importing::\r\n\r\n >>> cat('profiles.zcml')\r\n \r\n \r\n ...\r\n \r\n4. Check setuphandlers.py module - there must be importZEXPs function defined::\r\n\r\n >>> cat('setuphandlers.py')\r\n def setupVarious(context):\r\n ...\r\n def importZEXPs(context):\r\n ...\r\n\r\nThen simply prepare zexp objects and copy them to *import* directory.\r\n\r\n\r\nRELEASE NOTES !\r\n===============\r\n\r\nBefore releasing theme - I suggest to clean up setup.py script:\r\n\r\n- remove *theme_vars* argument (its value is useful only for theme development)\r\n\r\n- remove *entry_points* argument (same reason). It's useless in plone for now.\r\n\r\n- And remove *paster_plugins* argument too (it has sence in conjunction with entry_points during theme developing)\r\n\r\nSteps mentioned above prevent possible problems with\r\ntheme distribution/deployment.\r\n\r\nNotes:\r\n------\r\n\r\n* quintagroup.themetemplate v0.25 compatible with ZopeSkel >= 2.15\r\n\r\n\r\nChangelog\r\n=========\r\n\r\n0.25 (2010-06-24)\r\n-----------------\r\n\r\n- Correct version of the pacakge\r\n [mylan]\r\n- Fix incompatibility wity ZopeSkel>=2.15\r\n [mylan]\r\n- Updated tests\r\n [mylan]\r\n\r\n\r\n0.2.2 (unreleased)\r\n------------------\r\n\r\n- Updated import_zexps subtemplate - move this step into\r\n separate genericsetup profile\r\n [mylan]\r\n- Updated tests for changed import_zexps subtemplate\r\n [mylan]\r\n\r\n0.2 (unreleased)\r\n----------------\r\n\r\n- Added new css_dtml_skin subtemplate\r\n [mylan]\r\n- Added tests for css_dtml_skin subtemplate\r\n [mylan]\r\n\r\n0.14 (unreleased)\r\n-----------------\r\n\r\n- Refactoring theme vars storage-now storing in separate\r\n theme_vars.cfg file, without distutils writers [mylan]\r\n- Cleanup code [mylan]\r\n\r\n\r\n0.11 (2009-04-13)\r\n-----------------\r\n\r\n- Removed setup.cfg\r\n [mylan]\r\n\r\n\r\n0.10 (2009-04-13)\r\n-----------------\r\n\r\n- Updated README\r\n [olha]\r\n\r\n\r\n0.9 (2009-04-11)\r\n----------------\r\n\r\n- Changed package name/namespace to\r\n quintagroup.themetemplate.\r\n [mylan]\r\n\r\n\r\n0.8 (2009-04-10)\r\n----------------\r\n\r\n* Update tests, readme\r\n [mylan]\r\n\r\n* Update viewlet-order subtemplate\r\n [mylan]\r\n\r\n* Fix uninstall bug\r\n [mylan]\r\n\r\n\r\n0.7 (unreleased)\r\n----------------\r\n\r\n* Add uninstall profile to fix skins tool after theme is uninstalled\r\n [piv]\r\n\r\n\r\n0.1 (unreleased)\r\n----------------\r\n\r\n* Initial import Theme template with nested namespace.\r\n Support ZopeSkel' \"addcommad\" local command for extend\r\n Theme template, support extending with portlet, view local\r\n templates.\r\n [mylan]", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://svn.quintagroup.com/products/quintagroup.themetemplate", "keywords": "ZopeSkel theme template plone3 Quintagroup", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "quintagroup.themetemplate", "package_url": "https://pypi.org/project/quintagroup.themetemplate/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/quintagroup.themetemplate/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://svn.quintagroup.com/products/quintagroup.themetemplate" }, "release_url": "https://pypi.org/project/quintagroup.themetemplate/0.25/", "requires_dist": null, "requires_python": null, "summary": "Quintagroup theme template for Plone 3 with nested namespace", "version": "0.25" }, "last_serial": 798407, "releases": { "0.11": [ { "comment_text": "", "digests": { "md5": "89f64dc7d72f1993534e7895b505d785", "sha256": "a4f037595f494662fdbe3c07fdc592657bd0ce1ecddcc29ce79da4397f529f4d" }, "downloads": -1, "filename": "quintagroup.themetemplate-0.11-py2.4.egg", "has_sig": false, "md5_digest": "89f64dc7d72f1993534e7895b505d785", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 63200, "upload_time": "2009-04-13T17:54:18", "url": "https://files.pythonhosted.org/packages/cd/49/dd7d4e819928ff161639df16846970e5186ee3f04cea83a980a09ea0df0d/quintagroup.themetemplate-0.11-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "d16d701b860bae1eb7806fa5fd91d392", "sha256": "be9fecfedb49bbb8b374a00f5bdef00efba58e361184ba31a2a5910bda4ddc8e" }, "downloads": -1, "filename": "quintagroup.themetemplate-0.11.tar.gz", "has_sig": false, "md5_digest": "d16d701b860bae1eb7806fa5fd91d392", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35501, "upload_time": "2009-04-13T17:54:16", "url": "https://files.pythonhosted.org/packages/bf/45/10ecf1be350fe0ee7a9176940eb4bd0c7b4260b5d39a8ab32a87cc55f6bb/quintagroup.themetemplate-0.11.tar.gz" } ], "0.25": [ { "comment_text": "", "digests": { "md5": "16121ae3a5fe496c895b47ea3e314bf8", "sha256": "663e86a7f5bb40ba38a5ad672c99866766eb13e0b5766b14431ebef9ce95a2c6" }, "downloads": -1, "filename": "quintagroup.themetemplate-0.25-py2.4.egg", "has_sig": false, "md5_digest": "16121ae3a5fe496c895b47ea3e314bf8", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 65081, "upload_time": "2010-06-24T15:04:06", "url": "https://files.pythonhosted.org/packages/fc/7b/8f1a4d7ed838c18ee123aad835920d65fb1d69a23c930e5da2233263a6f2/quintagroup.themetemplate-0.25-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "a46b462f520642b98235b384aefa82f6", "sha256": "88f34f3028505dc4c1174ec5b505382b0f40e3b50140401126bdde2116677034" }, "downloads": -1, "filename": "quintagroup.themetemplate-0.25.tar.gz", "has_sig": false, "md5_digest": "a46b462f520642b98235b384aefa82f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39750, "upload_time": "2010-06-24T15:04:05", "url": "https://files.pythonhosted.org/packages/98/f7/f88e85445019d96a54e698c183c25f032fb9204f2cc96cbfad553899e6fd/quintagroup.themetemplate-0.25.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "16121ae3a5fe496c895b47ea3e314bf8", "sha256": "663e86a7f5bb40ba38a5ad672c99866766eb13e0b5766b14431ebef9ce95a2c6" }, "downloads": -1, "filename": "quintagroup.themetemplate-0.25-py2.4.egg", "has_sig": false, "md5_digest": "16121ae3a5fe496c895b47ea3e314bf8", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 65081, "upload_time": "2010-06-24T15:04:06", "url": "https://files.pythonhosted.org/packages/fc/7b/8f1a4d7ed838c18ee123aad835920d65fb1d69a23c930e5da2233263a6f2/quintagroup.themetemplate-0.25-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "a46b462f520642b98235b384aefa82f6", "sha256": "88f34f3028505dc4c1174ec5b505382b0f40e3b50140401126bdde2116677034" }, "downloads": -1, "filename": "quintagroup.themetemplate-0.25.tar.gz", "has_sig": false, "md5_digest": "a46b462f520642b98235b384aefa82f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39750, "upload_time": "2010-06-24T15:04:05", "url": "https://files.pythonhosted.org/packages/98/f7/f88e85445019d96a54e698c183c25f032fb9204f2cc96cbfad553899e6fd/quintagroup.themetemplate-0.25.tar.gz" } ] }