{ "info": { "author": "D.A.Dokter, H.Bouma", "author_email": "dokter@w20e.com, bouma@w20e.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: Pyramid", "Intended Audience :: Developers", "License :: Freely Distributable", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Site Management", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "w20e.pycms\n==========\n\nOnly fools and nerds create their own CMS nowadays. Hurray! Anyway, so\nhere it is, w20e.pycms. Using the Pyramid framework as its base,\nbuilding on top of good old Zope (and some Plone) concepts. The CMS is\ncreated using these main concepts:\n\n* ZODB as database\n* ZCML as configuration/glue language\n* small core\n* optional components (like search, catalog, sharing); just include what\n you like\n\nThe CMS is a framework, not an out of the box app. What you'll need to\ndo is create your own Pyramid app, using the CMS as base. We've tried\nto make this as easy as possible: use w20e.pycms.sitemaker (to be\nfound on github or pypi) to obtain a paster template for your app. Run\npaster to create your app, and there you go...\n\n\nWhy?\n----\n\nw20e.pycms is Yet Another CMS, but without using the acronym. Why,\nfor the flying spaghetti monsters sake another CMS? Well, you know how\nit goes. You use Plone for some years, find out that when your\nfavourite tool is a hammer, all problems have a rather strong tendency\ntowards nailishness... Then Pyramid comes along, giving you the best\nof Plone (ZODB, Zope Component Architecture, ZCML, Chameleon, etc.)\nfor creating lightweight apps. Then you need a Page with\nWYSIWYG... then you need search... sharing. Then you wake up with a\nbasic CMS in your hands. May as well share it so you can decide for\nyourself whether it is worth your while. I mean, you dont __have__ to\nuse it!\n\nAnyway, read on if you like...\n\nFor whom..?\n-----------\n\nw20e.pycms is not for the faint of heart, nor for people that cannot\nread Python code, hate programming, think that the use of XML for\nconfiguration is sooo 1990, are convinced that Windows 95 was the best\nOS ever or would preferrably use a rocket launcher to deal with vermin\nin the kitchen. It _is_ on the other hand, for those that rank\nfuckit.js among the best JS libraries ever, enjoy Terry Pratchett,\nlove buildout en ZCML and think that beer is so much more that just a\nbreakfast drink.\n\nFeatures\n--------\n\nOur little CMS gives you a framework to build your sites upon, if\nyou're not targeting the enterprise market. If you do, be gone (to the\nplone.org site)!\n\nPyCMS gives you:\n\n * ZODB for storing data\n * blobstorage\n * user & group management\n * search, using repoze.catalog (optional)\n * creating and maintaining pages\n * an easily extendable framework for new content types\n * a lot of ZCML configuration\n * CMS design based on (Twitter) Bootstrap\n\n\nGetting started\n---------------\n\nWe assume that you know how to use buildout, create virtual\nenvironments, like to use paster, etc. But this is only one way to get\nthings going...\n\nFirst, create a package for your project, requiring:\n\n w20e.pycms\n\nThe easiest way to do so, is using our paster template\npycms_project. Install the w20e.pycms.sitemaker package (get it from\ngithub), something along these lines:\n\n # virtualenv \n # cd ; ./bin/activate\n # ./bin/easy_install w20e.pycms.sitemaker\n # cd \n # paster create -t pycms_project \n\nIf you really want to do it by hand, create an __init__ file for your\nPyramid app like this:\n\n from w20e.pycms import make_pycms_app\n\n\n def main(global_config, **settings):\n\n return make_pycms_app(__package__, **settings)\n\nand Bob might be your Uncle.\n\nSecondly, create a buildout and virtualenv for your stuff. Why not use\nw20e.buildoutskel? Install it using easy_install, and\n\n # cd \n # paster create -t buildout\n\nand answer to the project name question, and pycms to\nthe type question.\nYou now have a bunch of buildout files, almost ready to run your app!\n\nYou most likely will consider creating a buildout-my.cfg that extends\nbuildout-base.cfg, and adds some develop paths, like:\n\ndevelop =\n \n\nLast, run python bootstrap.py and then buildout with your config file.\n\nNow it's time to rev up the engine, and see what has happend. Run your\napp like so (within the buildout dir):\n\n # ./bin/paster serve dvl.ini [--reload]\n\nDirect your favorite browser (most likely Lynx or Mosaic) to\nhttp://localhost:6543/ and sit back and relax!\n\n\nConfiguration\n\n-------------\n\nYou may or may not be totally satisfied with the result so far. If\nthis is utterly your idea of a superduper web app, good on ya! If not,\nread on...\n\n\n- Add the default management and public css / js files (if you want):\n\n add this to your configure.zcml:\n\n \n \n\n- Include any other CSS and JS you like, using the pycms zcml directives:\n\n \n\n \n\n- Override assets like favicon and robots.txt:\n\n \n\n- Most likely you'll want to override the 'content' macro, that is\n called to display a page. To do this, make your own pt file, make\n that extend 'main.macros['master'], and let it fill the 'body' slot:\n\n\n\n \n\n \n\n \n Good morning Grommit...\n\n \n \n \n \n\nand add to your configure.zcml (always assuming you called your macro\nmain.pt):\n\n \n\n\nUsing the CMS: core concepts\n----------------------------\n\nThe core CMS consists solely of pages. Pages are just things with\ntext. Nothing serious. You may want to create your own content types,\nactions, etc. Luckily that's not hard to do. Best way is to look at\nexisting code... Anyway, some examples here:\n\n\nActions\n-------\n\nYou can register actions with your content. The currently used setup\nmainly uses 'perspectives' or ways to look at your content. In the\nmanagement interface these are rendered as 'tabs'. Actions are\nconfigured using zcml. Use the action statment as follows:\n\n\n\nctype is an optional filter.\n\n\nContent types\n-------------\n\nCreate your own content types if you wish. You can register an icon,\nand possible subtypes with your type using:\n\n \n\nYour actual model should extend either\n w20e.pycms.models.base.BaseContent\nor\n w20e.pycms.models.base.BaseFolder.\n\nYou may want to use w20e.forms (read: should) for your model. You can\neither create an xml form that describes your model, or if you insist\non doing things more Pythonic, create your form\nprogrammatically. Checkout out w20e.forms for details.\n\nA simple model looks like this:\n\nfrom w20e.pycms.models.base import BaseContent\n\n\nclass SomethingSimple(BaseContent):\n\n \"\"\" Well, actually it's more like an 'object'... \"\"\"\n\n def __init__(self, content_id, data=None):\n\n BaseContent.__init__(self, content_id, data)\n\n def base_id(self):\n\n return self.__data__['title']\n\n @property\n def title(self):\n\n return self.__data__['title']\n\nYou can configure how your form for editing and adding is\nfound. Default is that PyCMS looks for a file in /forms/.xml, so in this case:\n\n /forms/somethingsimple.xml\n\nIf you want something completely different, configure an adapter for your\ncontent type that provides a form factory:\n\n \n\nAnd make sure it actually implements IFormFactory and can create a\nform (w20e.forms.interfaces.IForm).\n\n\nNatures\n-------\n\nAn alternative for defining content types is defining 'natures'. Let's\nface it: what is so special about an event? It is really just a page\nthing with a start- and end date and a location, isn't it? And what\nabout news? Isn't that not very much like a page too? If you agree,\nread on...\n\nA page can be not only a page, but it can also be news-ish, or\nevent-ish. That is it's nature. You can register natures like so:\n\n \n\nThis will make the nature show up in the 'natures' dropdown menu. Now\neither you leave it like this, or you also modify the form for the\npage with an w20e.forms.interfaces.IFormModifier implementation:\n\n \n\nAnd create a class Event along these lines:\n\n from zope.interface import implements\n from w20e.forms.interfaces import IForm, IFormModifier\n from w20e.forms.data.field import Field\n from w20e.forms.model.fieldproperties import FieldProperties\n from w20e.forms.rendering.control import Input\n from w20e.forms.rendering.group import FlowGroup\n\n\n class Event(object):\n\n implements(IFormModifier)\n\n def __init__(self, form):\n\n self.form = form\n\n def modify(self, form):\n\n \"\"\" Add begin, end and location to form \"\"\"\n\n form.data.addField(Field(\"start\"))\n form.data.addField(Field(\"end\"))\n form.data.addField(Field(\"location\"))\n\n grp = FlowGroup(\"eventgroup\", label=\"Event\")\n grp.addRenderable(Input(\"start\", \"Start of event\",\n extra_classes=\"datetime\",\n bind=\"start\"))\n grp.addRenderable(Input(\"end\", \"End of event\", bind=\"end\"))\n grp.addRenderable(Input(\"location\", \"Location\", bind=\"location\"))\n\n form.view.addRenderable(grp, pos=-1)\n\nOr whatever you think should be added to the page form...\n\n\nrobots.txt\n----------\n\nThe default robots.txt allows all. Override as per your liking...\n\n\nSearch\n------\n\nWould you like search enabled for your site?\n\nAdd this to your configure.zcml:\n\n \n\n\nSharing anyone?\n---------------\nWould you like search enabled for your site?\n\nAdd this to your configure.zcml:\n\n \n\nand this to your setup dependencies (don't forget to run buildout):\n\n w20e.pycms_sharing\n\n\nSettings\n--------\n\npycms.acl.force_new = True|False\n Force new version of ACL. All your security data will be lost\npycms.catalog.force_new = True|False\n Force new version of catalog. All your entries will be lost, but you\n can just run reindex-catalog and all is well again...\npycms.admin_user = :\n Admin user and password, like so: pycms.admin_user = admin:pipo\npycms.admin_secret = \n This secret may be used as URL parameter to obtain admin permission\n Use it wisely!\npycms.minify_css = True|False\n Minify CSS. Defaults to False\npycms.minify_js = True|False\n Minify JS. Defaults to False\npycms.logged_in_redirect = \npycms.rootclass = \n Defaults to w20e.pycms.models.site.Site\npycms.roottitle = \n Defaults to \"Welcome\"\npycms.from_addr\n Send email as ...\npycms.bcc_addr\n Send also to bcc\npycms.after_add_redirect\n Where to go after successfull add\npycms.cancel_add_redirect\n Where to go after cancelled add\npycms.after_del_redirect\n Where to go after delete\npycms.tempregister.timout = \n minimal amount of seconds before a temporary object might be removed\n\n\n1.1.2a\n------\n* json representation of pycms content types\n* upgrade jquery + jqueryui\n* small fixes\n\n1.1.1a\n------\n* initially created objects will have a temporary state, until they\nhave been completed\n* add_macros now within base view class, so it's easier to override\n* validation.js fixed for bootstrap class names\n\n1.0.2a\n======\n* Finally we have a serious (?) licence. Also updated some metadata.\n\n1.0.1a\n======\n* Enabled call to render viewlet through base view", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/wyldebeast-wunderliebe/w20e.pycms/", "keywords": "cms pyramid", "license": "beer-ware", "maintainer": null, "maintainer_email": null, "name": "w20e.pycms", "package_url": "https://pypi.org/project/w20e.pycms/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/w20e.pycms/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/wyldebeast-wunderliebe/w20e.pycms/" }, "release_url": "https://pypi.org/project/w20e.pycms/1.1.2b/", "requires_dist": null, "requires_python": null, "summary": "Pyramid CMS", "version": "1.1.2b" }, "last_serial": 801484, "releases": { "1.0.0a": [ { "comment_text": "", "digests": { "md5": "336635de2c3f3be659da6eee47c689f4", "sha256": "482e5291f0955eefe36f2a1d0eae04d62ed9719b6c2dfd487b309d117954de37" }, "downloads": -1, "filename": "w20e.pycms-1.0.0a.tar.gz", "has_sig": false, "md5_digest": "336635de2c3f3be659da6eee47c689f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1374653, "upload_time": "2012-07-10T11:44:20", "url": "https://files.pythonhosted.org/packages/fb/7c/b82f99fb0165659c1ad16a6c0f19e1e6ad50a730fe2f4f368567e8a710ed/w20e.pycms-1.0.0a.tar.gz" } ], "1.0.1a": [ { "comment_text": "", "digests": { "md5": "c096b63fc5c18b5d914c4100877e2c8c", "sha256": "53b70f0bad77dc46af8dfd99a94ce21d5b1442d30390af7eddc576b5414a5a4f" }, "downloads": -1, "filename": "w20e.pycms-1.0.1a-py2.7.egg", "has_sig": false, "md5_digest": "c096b63fc5c18b5d914c4100877e2c8c", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 1633662, "upload_time": "2012-07-24T12:07:48", "url": "https://files.pythonhosted.org/packages/ce/86/fef90d5c9b96d80d06ad237fb855fad70a28232ea643a46d2c6e3606eb1a/w20e.pycms-1.0.1a-py2.7.egg" } ], "1.0.2a": [ { "comment_text": "", "digests": { "md5": "b0b63b9fe0594d947c9dedd691edc0da", "sha256": "88f3a8c33b239be4325958853b6de1fe97e24efc6e4e96f0f01a507c225ede5b" }, "downloads": -1, "filename": "w20e.pycms-1.0.2a-py2.7.egg", "has_sig": false, "md5_digest": "b0b63b9fe0594d947c9dedd691edc0da", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 1633813, "upload_time": "2012-07-25T16:03:51", "url": "https://files.pythonhosted.org/packages/a5/6b/f503a41c67e4073181edea91d464d1480e59ea55a226d999cd52ef65a449/w20e.pycms-1.0.2a-py2.7.egg" } ], "1.1.2b": [ { "comment_text": "", "digests": { "md5": "fbfedb1cdae2f5841c1da2189d459a53", "sha256": "272b62e307553ba814c45aead38608ad64e3de03c8b2ea1e30b5b9399e4ffca9" }, "downloads": -1, "filename": "w20e.pycms-1.1.2b.tar.gz", "has_sig": false, "md5_digest": "fbfedb1cdae2f5841c1da2189d459a53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1447854, "upload_time": "2013-02-05T11:46:12", "url": "https://files.pythonhosted.org/packages/9c/de/552f4336fe3188d43075b57a5b3ff28a3ead89a1771ba7741080d32eae46/w20e.pycms-1.1.2b.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fbfedb1cdae2f5841c1da2189d459a53", "sha256": "272b62e307553ba814c45aead38608ad64e3de03c8b2ea1e30b5b9399e4ffca9" }, "downloads": -1, "filename": "w20e.pycms-1.1.2b.tar.gz", "has_sig": false, "md5_digest": "fbfedb1cdae2f5841c1da2189d459a53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1447854, "upload_time": "2013-02-05T11:46:12", "url": "https://files.pythonhosted.org/packages/9c/de/552f4336fe3188d43075b57a5b3ff28a3ead89a1771ba7741080d32eae46/w20e.pycms-1.1.2b.tar.gz" } ] }