Index: /quintagroup.quills.extras/tags/1.3.2/README.txt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/README.txt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/README.txt	(revision 762)
@@ -0,0 +1,4 @@
+Introduction
+============
+
+
Index: /quintagroup.quills.extras/tags/1.3.2/docs/HISTORY.txt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/docs/HISTORY.txt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/docs/HISTORY.txt	(revision 762)
@@ -0,0 +1,33 @@
+Changelog
+=========
+
+1.3.2 (2009-03-12)
+------------------
+
+- Fix print problem: update 'print this' link
+
+
+1.3.1 (2009-03-09)
+------------------
+
+- Remove RDF links in quills_macros_header
+- Remove RDF links in quilllslinks portlet
+
+
+1.2 (2009-03-06)
+----------------
+
+- Merged quills_81282 branch changes
+
+
+1.1 (2009-03-05)
+-------------------
+
+- Fix versions
+
+
+1.0 (2009-03-05)
+----------------
+
+* Initial release
+
Index: /quintagroup.quills.extras/tags/1.3.2/docs/INSTALL.txt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/docs/INSTALL.txt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/docs/INSTALL.txt	(revision 762)
@@ -0,0 +1,40 @@
+quintagroup.quills.extras Installation
+=======================
+
+ * When you're reading this you have probably already run
+   ``easy_install quintagroup.quills.extras``. Find out how to install setuptools
+   (and EasyInstall) here:
+   http://peak.telecommunity.com/DevCenter/EasyInstall
+
+ * Create a file called ``quintagroup.quills.extras-configure.zcml`` in the
+   ``/path/to/instance/etc/package-includes`` directory.  The file
+   should only contain this::
+
+       <include package="quintagroup.quills.extras" />
+
+
+Alternatively, if you are using zc.buildout and the plone.recipe.zope2instance
+recipe to manage your project, you can do this:
+
+ * Add ``quintagroup.quills.extras`` to the list of eggs to install, e.g.:
+
+    [buildout]
+    ...
+    eggs =
+        ...
+        quintagroup.quills.extras
+
+  * Tell the plone.recipe.zope2instance recipe to install a ZCML slug:
+
+    [instance]
+    recipe = plone.recipe.zope2instance
+    ...
+    zcml =
+        quintagroup.quills.extras
+
+  * Re-run buildout, e.g. with:
+
+    $ ./bin/buildout
+
+You can skip the ZCML slug if you are going to explicitly include the package
+from another package's configure.zcml file.
Index: /quintagroup.quills.extras/tags/1.3.2/docs/LICENSE.GPL
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/docs/LICENSE.GPL	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/docs/LICENSE.GPL	(revision 762)
@@ -0,0 +1,225 @@
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
Index: /quintagroup.quills.extras/tags/1.3.2/docs/LICENSE.txt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/docs/LICENSE.txt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/docs/LICENSE.txt	(revision 762)
@@ -0,0 +1,16 @@
+  quintagroup.quills.extras is copyright Quintagroup
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA 02111-1307 USA.
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/__init__.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/__init__.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/__init__.py	(revision 762)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/__init__.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/__init__.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/__init__.py	(revision 762)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/Extensions/utils.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/Extensions/utils.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/Extensions/utils.py	(revision 762)
@@ -0,0 +1,58 @@
+from zope.interface import alsoProvides, noLongerProvides
+
+from quills.app.utilities import recurseToInterface
+from quills.core.interfaces import IWeblogEnhanced
+from quills.core.interfaces.enabled import IPossibleWeblogEntry
+
+from Products.CMFCore.utils import getToolByName
+
+from quintagroup.quills.extras.browser.interfaces import IWeblogCategory
+
+def set_layout(sc_info):
+    #portal = sc_info.getPortal()
+    obj = sc_info.object
+    weblog = recurseToInterface(obj, IWeblogEnhanced)
+    if weblog:
+        updateBlogPost(obj)
+
+def updateBlogPost(obj):
+    # set default layout
+    obj.setLayout('weblogentry_view')
+    # add providing of IPossibleWeblogEntry interface
+    if not IPossibleWeblogEntry.providedBy(obj):
+        alsoProvides(obj, IPossibleWeblogEntry)
+    # allow discussion for object
+    dt = getToolByName(obj,'portal_discussion')
+    dt.overrideDiscussionFor(obj, 1)
+
+def processBlog(self, path, blogentry_types=["Document",]):
+    catalog = getToolByName(self,'portal_catalog')
+    brains = catalog(path=path, portal_type=blogentry_types)
+    for b in brains:
+        obj = b.getObject()
+        updateBlogPost(obj)
+        print b.getURL(), 'updated'
+    #raise Exception("some error")
+
+
+def processBlogSubFolders(self):
+    # update blog sub-folders
+    res = []
+    brains = self.portal_catalog(path='/'.join(self.getPhysicalPath()),
+                                 portal_type=['Large Plone Folder','Folder'])
+    context_path = '/'.join(self.getPhysicalPath())
+    brains = filter(lambda b:not b.getPath()==context_path, brains)
+    for bf in brains:
+        item_res = [bf.getPath(),0,0]
+        ob = bf.getObject()
+        if ob.hasProperty('layout'):
+            ob.manage_delProperties(['layout',])
+        ob.manage_addProperty('layout','weblogfolder_view','string')
+        if IWeblogEnhanced.providedBy(ob):
+            noLongerProvides(ob,IWeblogEnhanced)
+            item_res[1] = 1
+        if not IWeblogCategory.providedBy(ob):
+            alsoProvides(ob,IWeblogCategory)
+            item_res[2] = 1
+        res.append(item_res)
+    return res
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/__init__.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/__init__.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/__init__.py	(revision 762)
@@ -0,0 +1,5 @@
+#import weblogfolder_patch, keywords_widget_patch
+import keywords_widget_patch
+from zope.i18nmessageid import MessageFactory
+quintagroupQuillsMessageFactory = MessageFactory('quintagroup.quills.extras')
+
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/__init__.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/__init__.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/__init__.py	(revision 762)
@@ -0,0 +1,1 @@
+#
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/actions.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/actions.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/actions.pt	(revision 762)
@@ -0,0 +1,20 @@
+<tal:actions define="purl here/@@plone_portal_state/portal_url;
+                     here_url here/@@plone_context_state/object_url">
+<div class="belowentryItem"
+     i18n:domain="plone">
+    <a href="sendto_form"
+        tal:attributes="href string:${here_url}/sendto_form;">
+        <img src="mail_icon.gif" alt="Send this"
+            tal:attributes="src string:${purl}/mail_icon.gif" />
+        Send To
+    </a>
+</div>
+<div class="belowentryItem"
+        i18n:domain="plone">
+    <a href="javascript:this.print();">
+        <img src="mail_icon.gif" alt="Print this"
+                tal:attributes="src string:${purl}/print_icon.gif" />
+        Print page
+    </a>
+</div>
+</tal:actions>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/actionsbox.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/actionsbox.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/actionsbox.pt	(revision 762)
@@ -0,0 +1,6 @@
+<div class="blogSummaryThis">
+  <div class="blogSummaryThis-lining">
+    <tal:loop tal:repeat="viewlet options/viewlets"
+      tal:replace="structure viewlet/render" />
+  </div>
+</div>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/addthis_common.js
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/addthis_common.js	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/addthis_common.js	(revision 762)
@@ -0,0 +1,1 @@
+var addthis_options = 'digg, facebook, delicious, myspace, aolfav, propeller, google, live, stumbleupon, reddit, favorites, technorati, aim, more'
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/bookmarklets.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/bookmarklets.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/bookmarklets.pt	(revision 762)
@@ -0,0 +1,12 @@
+<div class="tryit belowentryItem"
+     i18n:domain="plone">
+    <a href="http://www.addthis.com/bookmark.php?v=20"
+        onmouseover="return addthis_open(this, '', '[URL]', '[TITLE]');"
+        onmouseout="addthis_close();" 
+        onclick="return addthis_sendto();">
+        <img src="http://s7.addthis.com/static/btn/sm-plus.gif"
+            width="16" height="16" border="0" alt="Bookmark and Share" />
+        Share/Bookmark
+    </a>
+    <script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"></script>
+</div>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/commentViews.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/commentViews.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/commentViews.py	(revision 762)
@@ -0,0 +1,168 @@
+from quills.app.browser.controllerView import FormControllerView, getToolByName
+from quills.app.utilities import talkbackURL
+from plone.memoize import instance
+from plone.app.content.browser.tableview import Table
+from zope.component import getMultiAdapter
+from zope.interface import implements
+import urllib, re
+
+
+talkback_url_extractor = re.compile("(.*)/talkback/\d+")
+
+class ManageCommentsView(FormControllerView):
+    """ The view class for the comments management form """
+    
+    def __init__(self, context, request):
+        super(ManageCommentsView, self).__init__(context, request)
+
+        self.form_submitted = bool(request.get('form.submitted'))
+        if bool(request.get('form.button.Delete')):
+            self.mode = "delete"
+        elif bool(request.get('form.button.Update')):
+            self.mode = "update"
+        elif bool(request.get('form.button.ResetFilter')):
+            self.mode = "reset"
+        elif bool(request.get('form.button.Publish')):
+            self.mode = "publish"
+        else:
+            self.mode = 'display'
+
+        self.author = request.get('form.field.author', '')
+        self.subject = request.get('form.field.subject', '')
+        self.review_state = request.get('form.field.review_state', '')
+        self.selected_comments = request.get('selected_comments', [])
+        self.portal_catalog = getToolByName(self.context,'portal_catalog')
+
+        self.contentFilter = {
+            'portal_type' : 'Discussion Item', 
+            'sort_on' : 'created', 
+            'sort_order' : 'reverse',
+            'path' : {'query' : '/'.join(self.context.getPhysicalPath()),}
+        }
+
+        self.filtered = False
+        if self.mode in ['delete', 'display', 'update']:
+            if self.author:
+                self.contentFilter['Creator'] = self.author
+                self.filtered = True
+            if self.subject:
+                self.contentFilter['Title'] = self.subject
+                self.filtered = True
+            if not self.review_state and self.contentFilter.has_key('review_state'):
+                del self.contentFilter['review_state']
+                self.filtered = True
+            elif self.review_state in ['published', 'private']:
+                self.contentFilter['review_state'] = self.review_state
+                self.filtered = True
+	        
+        if self.mode == "display":
+            self.getComments()
+
+    def validate(self):
+        """ performs validation and returns an errors dictionary """
+        errors = {}
+        if self.mode=='delete':
+            if self.selected_comments == []:
+                errors['status'] = 'failure'    # errors must not be empty...            
+                self.setMessage('You must select at least one comment for deletion.')
+                self.getComments()
+        return errors
+
+    def control(self):
+        """ performs the actions after a successful validation possibly
+            returning an errors dictionary """
+
+        if self.mode == "update":
+            self.setMessage('Filter applied.')
+        elif self.mode == "reset":
+            self.setMessage('Filter reset.')
+            self.author = None
+            self.subject = None
+            self.review_state = None
+        elif self.mode == "delete":
+            discussion_tool = getToolByName(self.context, 'portal_discussion')
+            for path in self.selected_comments:
+                self.deleteReply(discussion_tool, self.portal_catalog, path)
+            self.setMessage('%s comments have been deleted.' % str(len(self.selected_comments)))
+        elif self.mode == 'publish':
+            for path in self.selected_comments:
+                self.publishReply(self.portal_catalog, path)
+            self.setMessage('%s comments have been published.' % str(len(self.selected_comments)))
+        self.getComments()
+        return {}
+            
+    def deleteReply(self, dtool, pcatalog, path):
+        discussion_item = pcatalog(path=path)[0].getObject()
+        obj = discussion_item.parentsInThread()[0]
+        discussion = dtool.getDiscussionFor(obj)
+        discussion.deleteReply(discussion_item.getId())
+
+    def publishReply(self, pcatalog, path):
+        """publish the discussion item"""
+        discussion_item = pcatalog(path=path)[0].getObject()
+        roles = ['Anonymous']
+        discussion_item.review_state = "published"
+        discussion_item.manage_permission('View', roles, acquire=1)
+        discussion_item._p_changed = 1
+        discussion_item.reindexObject()
+	
+    def getComments(self):
+        self.comment_brains = self.portal_catalog(self.contentFilter)
+        self.num_of_comments = len(self.comment_brains)
+        self.has_comments = self.num_of_comments > 0
+        #return self.comment_brains
+        plone_utils = getToolByName(self.context, 'plone_utils')
+        plone_view = getMultiAdapter((self.context, self.request), name=u'plone')
+        portal_workflow = getToolByName(self.context, 'portal_workflow')
+        portal_properties = getToolByName(self.context, 'portal_properties')
+
+        curl = self.context.absolute_url()
+        results = []
+        for i, obj in enumerate(self.comment_brains):
+            if (i + 1) % 2 == 0:
+                table_row_class = "draggable even"
+            else:
+                table_row_class = "draggable odd"
+            
+            url = obj.getURL()
+            path = obj.getPath or "/".join(obj.getPhysicalPath())
+            absolute_url = url[:url.find('/talkback')]
+            url = "%s#%s" % (absolute_url, obj.id)
+            icon = None
+            
+            review_state = obj.review_state
+            state_class = 'state-' + plone_utils.normalizeString(review_state)
+            relative_url = obj.getURL(relative=True)
+            obj_type = obj.portal_type
+            modified = plone_view.toLocalizedTime(
+                obj.ModificationDate, long_format=1)
+            view_url = url
+            results.append(dict(
+                url = url,
+                Creator = obj.Creator,
+                id  = obj.getId,
+                quoted_id = obj.getId,
+                path = path,
+                title_or_id = obj.Title,
+                description = obj.Description,
+                obj_type = obj_type,
+                size = obj.getObjSize,
+                modified = modified,
+                icon = '',
+                type_class = 'contenttype-discutionitem',
+                wf_state = review_state,
+                state_title = review_state,
+                state_class = state_class,
+                is_browser_default = 0,
+                folderish = 0,
+                relative_url = relative_url,
+                view_url = view_url,
+                table_row_class = table_row_class,
+                is_expired = 0,
+                ))
+        self.table = Table(self.request, curl, curl+'/manage_comments', results)
+        return self.comment_brains
+        
+        
+    def talkbackURL(self, item):
+        return talkbackURL(item)
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/configure.zcml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/configure.zcml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/configure.zcml	(revision 762)
@@ -0,0 +1,67 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    xmlns:plone="http://namespaces.plone.org/plone"
+    i18n_domain="quintagroup.quills.extras">
+
+     <browser:viewletManager
+         name="quills.actionsbox"
+         provides=".interfaces.IActionsBox"
+         permission="zope2.View"
+         class=".viewlets.ConditionalViewletManager"
+         template="actionsbox.pt"
+        />
+
+    <browser:viewlet
+        name="quills.actionsbox.actions"
+        manager=".interfaces.IActionsBox"
+        template="actions.pt"
+        permission="zope.Public"
+        />
+
+    <browser:viewlet
+        name="quills.actionsbox.bookmarklets"
+        manager=".interfaces.IActionsBox"
+        template="bookmarklets.pt"
+        permission="zope.Public"
+        />
+
+   <browser:page
+        for=".interfaces.IWeblogCategory"
+        class="Products.QuillsEnabled.browser.weblogview.WeblogView"
+        template="weblogfolder_view.pt"
+        permission="zope2.View"
+        name="weblogfolder_view"
+        allowed_interface="quills.core.browser.interfaces.IWeblogView" />
+
+   <browser:page
+        for=".interfaces.IWeblogCategory"
+        class=".weblogview.WeblogSubfolderView"
+        permission="zope2.View"
+        name="weblogsubfolder"
+        allowed_interface="quills.core.interfaces.IWeblog" 
+        />
+
+    <class class="quills.app.browser.weblogview.WeblogEntryView">
+       <implements interface="plone.app.layout.globals.interfaces.IViewView" />
+    </class>
+
+    <browser:resource
+        name="print_blogentry.js"
+        layer="elaw.theme.webresults.browser.interfaces.IThemeSpecific"
+        file="print_page.js"
+        />
+
+    <browser:resource
+        name="addthis_common.js"
+        layer="elaw.theme.webresults.browser.interfaces.IThemeSpecific"
+        file="addthis_common.js"
+        />
+
+    <adapter
+        for="quills.core.interfaces.IPossibleWeblog"
+        provides="quills.core.interfaces.IWeblogLocator"
+        factory="quills.app.locator.RecursingUpLocator"
+        />
+
+</configure>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/interfaces.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/interfaces.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/interfaces.py	(revision 762)
@@ -0,0 +1,10 @@
+from zope.viewlet.interfaces import IViewletManager
+from quills.core.interfaces.enabled import IPossibleWeblog
+
+class IActionsBox(IViewletManager):
+    """A viewlet manager for collect actions
+    """
+
+class IWeblogCategory(IPossibleWeblog):
+    """Marker interface for Blog' category folder
+    """
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/manage_comments.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/manage_comments.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/manage_comments.pt	(revision 762)
@@ -0,0 +1,132 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+    lang="en"
+    i18n:domain="quills.app"
+    metal:use-macro="here/main_template/macros/master">
+    <metal:block fill-slot="top_slot"
+                 tal:define="dummy python:request.set('disable_border',1)" />
+    <metal:override fill-slot="column_two_slot" />
+    <body>
+      <div metal:fill-slot="main">
+      <metal:contentsmacro 
+         define-macro="contents"
+         tal:define="errors options/state/getErrors | python: {};">
+         <h1 i18n:translate="manage_comments">
+           Manage Comments
+         </h1>
+         <p class="discreet"
+             i18n:translate="no_comments"
+             tal:condition="not: view/has_comments">
+           There are no comments for Weblog entries.
+         </p>
+         <metal:listing>
+           <form name="commentsForm"
+             method="post"
+             tal:attributes="action request/ACTUAL_URL">
+             <span i18n:translate="">Author</span>: <input type='text' name='form.field.author' size='10' tal:attributes='value view/author'/>
+             <span i18n:translate="">Subject</span>: <input type='text' name='form.field.subject' size='20' tal:attributes='value view/subject'/>
+             <span i18n:translate="">Review state</span>: 
+             <select name='form.field.review_state'> 
+    	          <option value='' 
+    					          tal:attributes="selected python:view.review_state=='All' and 'selected' or None">All</option>
+    	          <option value='published' 
+    	                  tal:attributes="selected python:view.review_state=='published' and 'selected'  or None">Published</option>
+    	          <option value='private' 
+    	                  tal:attributes="selected python:view.review_state=='private' and 'selected' or None">Private</option>
+	           </select>
+               <input class="context"
+                 tabindex=""
+                 type="submit"
+                 name="form.button.Update"
+                 value="Update"
+                 i18n:attributes="value" />
+             <input class="context"
+                 tal:condition="view/filtered"
+                 tabindex=""
+                 type="submit"
+                 name="form.button.ResetFilter"
+                 value="Reset"
+                 i18n:attributes="value" />
+             <input class="context"
+                 tabindex=""
+                 type="submit"
+                 name="form.button.Delete"
+                 value="Delete"
+                 i18n:attributes="value" />
+             <input class="context"
+              tabindex=""
+                 type="submit"
+                 name="form.button.Publish"
+                 value="Publish"
+                 i18n:attributes="value" />
+             <input type="hidden" name="form.submitted" value="1" /> 
+               <table
+                   class="listing"
+                   summary="Comments listing"
+                   tal:condition="view/has_comments">
+                   <thead>
+                       <tr>
+                           <th class="nosort">
+                               <input class="noborder"
+                                   type="checkbox"
+                                   src="select_all_icon.gif"
+                                   name="selectButton"
+                                   title="Select all items"
+                                   onClick="toggleSelect(this,'selected_comments:list');"
+                                   tal:attributes="src string:$portal_url/select_all_icon.gif"
+                                   alt="Select all items"
+                                   i18n:attributes="title label_select_all_items; alt label_select_all_items;"
+                                   />
+                           </th>
+                           <th class="nosort">&nbsp;Date&nbsp;</th>
+                           <th class="nosort">&nbsp;Author&nbsp;</th>
+                           <th class="nosort">&nbsp;Subject&nbsp;</th>
+                       </tr>
+                   </thead>
+
+                   <tbody>
+                       <tal:items tal:repeat="comment view/table/batch">
+                           <tr tal:define="
+                               comment_id           comment/id;
+                               comment_path         comment/path;
+                               comment_url          comment/url;
+                               comment_author       comment/Creator;
+                               comment_subject      comment/title_or_id;
+                               comment_modified     comment/modified;
+                               oddrow               repeat/comment/odd;
+                               item_class python:comment['wf_state']=='private' and 'state-private' or None"
+                               tal:attributes="class python:oddrow and 'even' or 'odd'" >
+
+                               <td>
+                                   <input type="checkbox"
+                                       class="noborder"
+                                       name="selected_comments:list" id="#"
+                                       value="#"
+                                       tal:attributes="
+                                           value   comment_path;
+                                           id      string:cb_$comment_id;
+                                           checked python:request.get('ids_checked', False) and 'checked' or None;
+                                           alt     string:Select $comment_subject;
+                                           title   string:Select $comment_subject;" />
+
+                               </td>
+
+                               <td tal:content="python:here.toLocalizedTime(comment_modified, long_format=1)">
+                                   08/19/2001 03:01 AM
+                               </td>
+                               <td> <a tal:attributes="href comment_url;
+                                                       class item_class" tal:content="comment_author" /></td>
+                               <td> <a tal:attributes="href comment_url;
+                                                       class item_class" tal:content="comment_subject" /></td>
+
+                           </tr>
+                       </tal:items>
+                   </tbody>
+               </table>
+             </form>
+            <div tal:replace="structure view/table/batching" />
+           </metal:listing>
+         </metal:contentsmacro>
+      </div>
+    </body>
+</html>
+
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/overrides.zcml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/overrides.zcml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/overrides.zcml	(revision 762)
@@ -0,0 +1,31 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    xmlns:plone="http://namespaces.plone.org/plone"
+    i18n_domain="quintagroup.quills.extras">
+
+    <browser:page
+        for="quills.core.interfaces.enabled.IWeblogEnhanced"
+        class=".commentViews.ManageCommentsView"
+        template="manage_comments.pt"
+        permission="cmf.ManagePortal"
+        name="manage_comments" />
+
+    <browser:page
+        for="quills.core.interfaces.IPossibleWeblogEntry"
+        class=".weblogview.CustomWeblogEntryView"
+        template="weblogentry_view.pt"
+        permission="zope2.View"
+        name="weblogentry_view"
+        allowed_interface="quills.core.browser.interfaces.IWeblogEntryView"
+        allowed_attributes="day month" />
+
+    <browser:page
+        for="quills.core.interfaces.enabled.IWeblogEnhanced"
+        class="quills.app.browser.weblogview.WeblogView"
+        template="weblog_view.pt"
+        allowed_interface="quills.core.browser.interfaces.IWeblogView"
+        permission="zope2.View"
+        name="weblog_view" />
+
+</configure>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/print_page.js
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/print_page.js	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/print_page.js	(revision 762)
@@ -0,0 +1,5 @@
+function printPage(){
+    window.print()
+}
+
+registerPloneFunction(printPage)
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/viewlets.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/viewlets.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/viewlets.py	(revision 762)
@@ -0,0 +1,9 @@
+from plone.app.viewletmanager.manager import BaseOrderedViewletManager
+from quills.core.interfaces.enabled import IWeblogEnhanced
+
+class ConditionalViewletManager(BaseOrderedViewletManager):
+
+    def render(self):
+        if not IWeblogEnhanced.providedBy(self.context):
+            return super(ConditionalViewletManager, self).render()
+        return u''
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblog_view.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblog_view.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblog_view.pt	(revision 762)
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US"
+      lang="en-US"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      metal:use-macro="here/main_template/macros/master"
+      i18n:domain="quills.app">
+  <body>
+    <metal:feed fill-slot="head_slot">
+         <metal:block metal:use-macro="context/quills_header_macros/macros/feed-links"></metal:block>
+    </metal:feed>
+    <div metal:fill-slot="main"
+         tal:define="weblog view/getWeblog;
+                     weblog_content nocall:context">
+      <p id="blog-uid"
+         class="discreet"
+         tal:define="show_border python:context.showEditableBorder(template_id=template_id, actions=actions );"
+         tal:condition="show_border">
+        <span i18n:translate="weblog_edit_app_note">
+          Note: for some weblog editors you will need to provide the
+          following string as id to edit this blog:
+        </span>
+      </p>
+      <div id="content-weblog">
+        <metal:macro use-macro="context/weblog_macros/macros/list-entries"/>
+      </div>
+     <div tal:replace="structure provider:plone.belowcontentbody" />
+    </div>
+  </body>
+</html>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogentry_view.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogentry_view.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogentry_view.pt	(revision 762)
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US"
+      lang="en-US"
+      metal:use-macro="context/main_template/macros/master"
+      i18n:domain="quills.app">
+
+  <body>
+    <metal:feed fill-slot="head_slot">
+      <metal:block metal:use-macro="context/quills_header_macros/macros/feed-links"></metal:block>
+
+    </metal:feed>
+    <div metal:fill-slot="main"
+         tal:define="entry_content nocall:context;
+                     entry view/getWeblogEntry;
+                     weblog_content python:view.getWeblogContentObject();
+                     weblog python:view.getWeblog();
+                     wvconfig view/getConfig;">
+
+      <div tal:replace="structure provider:plone.abovecontenttitle" />
+      <div class="weblogViewDate">
+        <div class="weblogDateMonth"
+             tal:content="view/month" />
+        <div class="weblogDateDay"
+             tal:content="view/day" />
+      </div>
+
+      <h1 class="documentFirstHeading">
+        <metal:field use-macro="python:here.widget('title', mode='view')">
+          Title
+        </metal:field>
+      </h1>
+      <!-- Commented out for now, we don't want the global keywords, we
+           want our own system.
+           <div tal:replace="structure provider:plone.belowcontenttitle" />
+      -->
+      <metal:macro use-macro="context/entry_macros/macros/short-byline" />
+      <metal:macro use-macro="context/entry_macros/macros/filed-under" />
+      <metal:macro use-macro="context/entry_macros/macros/topic-images" />
+      <p class="weblog-entry-only-excerpt">
+        <metal:field use-macro="python:here.widget('description', mode='view')">
+          Description
+        </metal:field>
+      </p>
+      <div tal:replace="structure provider:plone.abovecontentbody" />
+      <div>
+        <metal:field use-macro="python:here.widget('text', mode='view')">
+          Main text
+        </metal:field>
+      </div>
+      <metal:sub>
+        <metal:macro use-macro="context/entry_macros/macros/relatedItems" />
+      </metal:sub>
+<!--       <div tal:replace="structure provider:quills.actionbox" /> -->
+      <div tal:replace="structure provider:plone.belowcontentbody" />
+
+    </div>
+  </body>
+</html>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogfolder_view.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogfolder_view.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogfolder_view.pt	(revision 762)
@@ -0,0 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US"
+      lang="en-US"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      metal:use-macro="here/main_template/macros/master"
+      i18n:domain="quills.app">
+  <body>
+    <metal:feed fill-slot="head_slot">
+         <metal:block metal:use-macro="context/quills_header_macros/macros/feed-links"></metal:block>
+    </metal:feed>
+    <div metal:fill-slot="main"
+         tal:define="weblog view/getWeblog;
+                     weblog_content nocall:context;
+                     weblogsubfolder context/@@weblogsubfolder;
+                     entries weblogsubfolder/getEntries">
+      <p id="blog-uid"
+         class="discreet"
+         tal:define="show_border python:context.showEditableBorder(template_id=template_id, actions=actions );"
+         tal:condition="show_border">
+        <span i18n:translate="weblog_edit_app_note">
+          Note: for some weblog editors you will need to provide the
+          following string as id to edit this blog:
+        </span>
+      </p>
+      <div id="content-weblog">
+        <metal:macro use-macro="context/weblog_macros/macros/list-entries"/>
+      </div>
+     <div tal:replace="structure provider:plone.belowcontentbody" />
+    </div>
+  </body>
+</html>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogview.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogview.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/browser/weblogview.py	(revision 762)
@@ -0,0 +1,34 @@
+from DateTime.DateTime import DateTime
+
+from plone.memoize.view import memoize
+from Products.Archetypes.ExtensibleMetadata import FLOOR_DATE
+from Products.QuillsEnabled.browser.weblogview import WeblogEntryView
+
+from quills.core.interfaces import IWeblog
+from quills.app.browser.baseview import BaseView
+
+class CustomWeblogEntryView(WeblogEntryView):
+
+    @memoize
+    def date(self):
+        date = self.context.effective()
+        if date == FLOOR_DATE:
+            date = self.context.modified()
+        if date == FLOOR_DATE:
+            date = self.context.created()
+        return date
+
+    @property
+    def month(self):
+        return DateTime(self.date()).strftime('%b').capitalize()
+
+    @property
+    def day(self):
+        return DateTime(self.date()).day()
+
+class WeblogSubfolderView(BaseView):
+    """ Provide IWeblog interface for Products.Archetypes.interfaces.IBaseFolder.
+        Used in weblog subfolder view
+    """
+    def getEntries(self):
+        return IWeblog(self.context).getEntries()
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/configure.zcml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/configure.zcml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/configure.zcml	(revision 762)
@@ -0,0 +1,24 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:five="http://namespaces.zope.org/five"
+    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
+    xmlns:cmf="http://namespaces.zope.org/cmf"
+    i18n_domain="quintagroup.quills.extras">
+
+  <include package=".browser" />
+
+  <include package=".portlets" />
+
+  <cmf:registerDirectory name="quills_extras"/>
+
+  <!-- profiles -->
+  <genericsetup:registerProfile
+      name="default"
+      title="quintagroup.quills.extras"
+      directory="profiles/default"
+      description="Extension profile which extends quills paroduct."
+      provides="Products.GenericSetup.interfaces.EXTENSION"
+      for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+      />
+
+</configure>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/keywords_widget_patch.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/keywords_widget_patch.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/keywords_widget_patch.py	(revision 762)
@@ -0,0 +1,36 @@
+from Products.AutocompleteWidget.AutocompleteWidget import AutocompleteWidget
+from Products.Archetypes import PloneMessageFactory as _
+from Products.CMFCore.utils import getToolByName
+from Products.Archetypes.utils import DisplayList
+from Products.ATContentTypes.content import schemata
+from Products.ATContentTypes.content.schemata import marshall_register
+from Products.ATContentTypes.content.schemata import ATContentTypeSchema
+from Products.ATContentTypes.content.base import ATCTMixin
+from Products.ATContentTypes.content.document import ATDocument
+from Products.ATContentTypes.content.folder import ATFolder, ATBTreeFolder
+from Products.ATContentTypes.content.image import ATImage
+from Products.ATContentTypes.content.event import ATEvent
+from Products.ATContentTypes.content.file import ATFile
+from Products.ATContentTypes.content.newsitem import ATNewsItem
+
+new_subject_widget = AutocompleteWidget(
+    label=_(u'label_categories', default = u'Categories'),
+    description=_(u'help_categories',
+                  default = u'Also known as keywords, tags or labels, '
+                           'these help you categorize your content.'),
+    actb_filter_bogus = 0,
+    actb_expand_onfocus = 0,
+    maxlength='1024'
+ 	)
+
+def getKeywords(self):
+    portal_catalog = getToolByName(self, 'portal_catalog')
+    res = portal_catalog.uniqueValuesFor('Subject')
+    return DisplayList(zip(res,res))
+
+ATCTMixin.getKeywords = getKeywords 	
+
+for content_type in [ATFolder, ATDocument, ATBTreeFolder, ATImage, ATEvent, ATFile, ATNewsItem]:
+    content_type.schema['subject'].widget = new_subject_widget
+    content_type.schema['subject'].vocabulary = 'getKeywords'
+    
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/overrides.zcml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/overrides.zcml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/overrides.zcml	(revision 762)
@@ -0,0 +1,10 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:zcml="http://namespaces.zope.org/zcml">
+    <include zcml:condition="installed quills.app"
+             package=".browser" file="overrides.zcml" />
+
+    <include zcml:condition="installed quills.app"
+             package=".portlets" file="overrides.zcml" />
+
+</configure>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/__init__.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/__init__.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/__init__.py	(revision 762)
@@ -0,0 +1,1 @@
+#
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/archive.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/archive.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/archive.pt	(revision 762)
@@ -0,0 +1,28 @@
+<dl class="portlet portletWeblogArchive"
+    i18n:domain="plone"
+    tal:define="years view/getSubArchives;"
+    tal:condition="years">
+
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span class="tile"
+              tal:content="view/title">_title_</span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <dd class="portletItem lastItem">
+        <ul tal:repeat="year years">
+            <li>
+                <h5 tal:content="year/title">year title</h5>
+                <ul tal:define="months year/months">
+                    <li tal:repeat="month months">
+                        <a href=""
+                            tal:attributes="href month/murl">
+                            <span i18n:translate="" i18n:domain="plone" tal:content="python: view.getMonthName(month['mid'])" />&nbsp;(<b tal:content="month/mlen"/>)
+                        </a>
+                    </li>
+                </ul>
+            </li>
+        </ul>
+    </dd>
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/archive.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/archive.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/archive.py	(revision 762)
@@ -0,0 +1,25 @@
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+from quills.app.portlets import archive
+
+class Renderer(archive.Renderer):
+
+    _template = ViewPageTemplateFile('archive.pt')
+    
+    @property
+    def getSubArchives(self):
+        res = []
+        arch = super(Renderer, self).getSubArchives
+        arch.reverse()
+        for y in arch:
+            ydata = {'title'  : y.Title(),
+                     'months': []}
+            months = y.getSubArchives()
+            months.reverse()
+            for m in months:
+                ydata['months'].append(
+                    {'murl':m.absolute_url() ,
+                     'mid' :m.getId(),
+                     'mlen':len(m)})
+            res.append(ydata)
+        return res
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/authors.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/authors.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/authors.pt	(revision 762)
@@ -0,0 +1,64 @@
+<dl class="portlet portletWeblogAuthors"
+    i18n:domain="plone">
+
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <a class="tile"
+           tal:content="view/title"
+           tal:attributes="href view/getAuthorsURL">_title_</a>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <tal:block repeat="author view/authors">
+
+      <dd class="portletItem odd" metal:define-macro="author"
+          tal:define="portrait python: view.getPortraitFor(author);
+                      authorinfo python: view.getInfoFor(author);
+                      author_listing_url python:view.getAuthorURL(authorinfo['username']);"
+          tal:attributes="class python:repeat['author'].odd and 'portletItem even' or 'portletItem odd'">
+
+        <h1 class="documentFirstHeading">
+          <a href=""
+             tal:attributes="href author_listing_url"
+             tal:content="authorinfo/fullname">
+              Author Name
+          </a>
+        </h1>
+
+        <div class="discreet"
+             tal:condition="python:view.data.show_location and authorinfo['location']"
+             i18n:translate="text_location">
+          Location:
+          <span tal:content="authorinfo/location"
+                tal:omit-tag=""
+                i18n:name="location">
+            Some location
+          </span>
+        </div>
+        
+        <a href=""
+           tal:attributes="href author_listing_url">
+            <img src=""
+                 alt=""
+                 title=""
+                 class="portraitPhoto"
+                 tal:condition="python:view.data.show_portrait and portrait"
+                 tal:attributes="src portrait/absolute_url;
+                                 alt authorinfo/fullname;
+                                 title authorinfo/fullname;" />
+        </a>
+        <div class="visualClear"><!----></div>
+
+        <div tal:condition="python:view.data.show_description and authorinfo['description']"
+             tal:content="authorinfo/description" />
+
+      </dd>
+
+    </tal:block>
+
+    <dd class="portletFooter">
+        <span class="portletBottomLeft"></span>
+        <span class="portletBottomRight"></span>
+    </dd>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/categories.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/categories.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/categories.pt	(revision 762)
@@ -0,0 +1,28 @@
+<dl class="portlet portletWeblogCategories"
+    i18n:domain="quills.app">
+
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span class="tile"
+              tal:content="view/title">_title_</span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <tal:loop repeat="cat view/getCategories">
+    <dd class="portletItem odd"
+	tal:attributes="class python:repeat['cat'].even() and 'portletItem odd' or 'portletItem even'">
+       <a title="Category" href="http://"
+          tal:content="cat/title|default"
+          tal:attributes="title cat/title;
+                          href cat/url">
+          Blog Category
+        </a>
+    </dd>
+    </tal:loop>
+
+    <dd class="portletFooter">
+        <span class="portletBottomLeft"></span>
+        <span class="portletBottomRight"></span>
+    </dd>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/categories.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/categories.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/categories.py	(revision 762)
@@ -0,0 +1,81 @@
+# Zope imports
+from zope.formlib import form
+from zope.interface import implements
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+# CMF imports
+from Products.CMFCore.utils import getToolByName
+
+# Plone imports
+from plone.app.portlets.portlets import base
+from plone.app.portlets.browser.formhelper import NullAddForm
+from plone.memoize.instance import memoize
+from plone.portlets.interfaces import IPortletDataProvider
+
+# Quills imports
+from quills.app import QuillsAppMessageFactory as _
+
+# Local imports
+from quills.app.portlets.base import BasePortletRenderer
+
+
+PORTLET_TITLE = _(u"Weblog Categories")
+PORTLET_DESC = _(u"This portlet provides list of weblog categories.")
+
+
+class IWeblogCategoriesPortlet(IPortletDataProvider):
+    """A weblog administration portlet.
+    """
+
+
+class Assignment(base.Assignment):
+    implements(IWeblogCategoriesPortlet)
+
+    @property
+    def title(self):
+        return PORTLET_TITLE
+
+
+class Renderer(BasePortletRenderer, base.Renderer):
+
+    _template = ViewPageTemplateFile('categories.pt')
+
+    @property
+    def available(self):
+        return self.getCategories() and True or False
+
+    @property
+    def title(self):
+        return PORTLET_TITLE
+
+    @memoize
+    def getCategories(self):
+        cats = []
+        weblog = self.getWeblogContentObject()
+        if weblog:
+            catalog = getToolByName(self.context, 'portal_catalog')
+            bcats = catalog(
+                path='/'.join(weblog.getPhysicalPath()),
+                portal_type=['Folder','Large Plone Folder'],
+                object_provides='quintagroup.quills.extras.browser.interfaces.IWeblogCategory'
+            )
+            wbpath = '/'.join(weblog.getPhysicalPath())
+            bcats = filter(lambda b:not b.getPath() == wbpath, bcats)
+            cats = [{'title':b.Title or b.getId, 'url':b.getURL} for b in bcats]
+        return cats
+
+
+class AddForm(NullAddForm):
+    form_fields = form.Fields(IWeblogCategoriesPortlet)
+    label = _(u'add-portlet', default=u"Add ${portlet-name} Portlet", 
+              mapping={u'portlet-name': PORTLET_TITLE})
+    description = PORTLET_DESC
+
+    def create(self):
+        return Assignment()
+
+
+class EditForm(base.EditForm):
+    form_fields = form.Fields(IWeblogCategoriesPortlet)
+    label = _(u'edit-portlet', default=u"Edit ${portlet-name} Portlet", mapping={u'portlet-name': PORTLET_TITLE})
+    description = PORTLET_DESC
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/configure.zcml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/configure.zcml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/configure.zcml	(revision 762)
@@ -0,0 +1,50 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:plone="http://namespaces.plone.org/plone"
+    i18n_domain="elaw.webresults">
+
+    <!-- Ensure Plone's portlets ZCML has already been processed;
+         without this, we may get a permission lookup error
+      -->
+    <include package="plone.app.portlets" />
+
+    <!-- -*- extra stuff goes here -*- -->
+
+  <plone:portlet
+      name="quintagroup.quills.extras.MostCommented"
+      interface=".mostcommented.IMostCommented"
+      assignment=".mostcommented.Assignment"
+      view_permission="zope2.View"
+      edit_permission="cmf.ManagePortal"
+      renderer=".mostcommented.Renderer"
+      addview=".mostcommented.AddForm"
+      editview=".mostcommented.EditForm"
+      />
+
+  <plone:portlet
+      name="quintagroup.quills.extras.ResentPosts"
+      interface=".recententries.IRecentWeblogEntriesPortlet"
+      assignment=".recententries.Assignment"
+      renderer=".recententries.Renderer"
+      addview=".recententries.AddForm"
+      editview=".recententries.EditForm"
+      />
+
+  <plone:portlet
+      name="quintagroup.quills.extras.Categories"
+      interface=".categories.IWeblogCategoriesPortlet"
+      assignment=".categories.Assignment"
+      view_permission="zope2.View"
+      edit_permission="cmf.ManagePortal"
+      renderer=".categories.Renderer"
+      addview=".categories.AddForm"
+      editview=".categories.EditForm"
+      />
+
+  <plone:portletRenderer
+      portlet="quills.app.portlets.quillslinks.IQuillsLinksPortlet"
+      template="quillslinks.pt"
+      layer="elaw.theme.webresults.browser.interfaces.IThemeSpecific"
+      />
+
+</configure>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/mostcommented.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/mostcommented.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/mostcommented.pt	(revision 762)
@@ -0,0 +1,35 @@
+<dl class="portlet portletMostCommented"
+    i18n:domain="elaw.theme.webresults.portlets">
+
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span>
+           Most commented
+        </span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <tal:items tal:repeat="data view/mostCommented">
+    <dd class="portletItem"
+        tal:define="oddrow repeat/data/odd;
+                    num_comm python:data[0];
+                    brain python:data[1];
+                    wf_state brain/review_state;
+                    wf_state_class python:'state-' + wf_state;"
+        tal:attributes="class python:oddrow and  'portletItem even' or 'portletItem odd'">
+        <a href="" class="tile"
+            tal:attributes="href brain/getURL;
+                            title brain/Description;">
+            <tal:title content="string:${brain/Title} ($num_comm)">
+                Title (3)
+            </tal:title>
+        </a>
+    </dd>
+    </tal:items>
+
+    <dd class="portletFooter">
+        <span class="portletBottomLeft"></span>
+        <span class="portletBottomRight"></span>
+    </dd>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/mostcommented.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/mostcommented.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/mostcommented.py	(revision 762)
@@ -0,0 +1,146 @@
+from zope.interface import Interface
+from zope.interface import implements
+from zope.component import getMultiAdapter
+
+from plone.app.portlets.portlets import base
+from plone.portlets.interfaces import IPortletDataProvider
+
+from zope import schema
+from zope.formlib import form
+from plone.memoize.instance import memoize
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from DateTime.DateTime import DateTime
+
+from quintagroup.quills.extras import quintagroupQuillsMessageFactory as _
+
+class IMostCommented(IPortletDataProvider):
+    """A portlet
+
+    It inherits from IPortletDataProvider because for this portlet, the
+    data that is being rendered and the portlet assignment itself are the
+    same.
+    """
+
+    # TODO: Add any zope.schema fields here to capture portlet configuration
+    # information. Alternatively, if there are no settings, leave this as an
+    # empty interface - see also notes around the add form and edit form
+    # below.
+
+    blog = schema.TextLine(
+        title=_(u"Path to Blog"),
+        description=_(u"Physical path to blog, from the plone object 'blog'"),
+        required=True)
+
+    period = schema.Int(
+        title=_(u"Actual Period"),
+        description=_(u"Actual period in days"),
+        default = 30,
+        required=True)
+
+    limit = schema.Int(
+        title=_(u"Actual Period"),
+        default = 5,
+        description=_(u"Actual period in days"),
+        required=True)
+
+
+class Assignment(base.Assignment):
+    """Portlet assignment.
+
+    This is what is actually managed through the portlets UI and associated
+    with columns.
+    """
+
+    implements(IMostCommented)
+
+    # TODO: Set default values for the configurable parameters here
+
+    # some_field = u""
+
+    # TODO: Add keyword parameters for configurable parameters here
+    # def __init__(self, some_field=u"):
+    #    self.some_field = some_field
+
+    def __init__(self, blog='/www/blog', period=30, limit=5):
+        self.blog = blog
+        self.period = period
+        self.limit = limit
+
+    @property
+    def title(self):
+        """This property is used to give the title of the portlet in the
+        "manage portlets" screen.
+        """
+        return "Most Commented"
+
+class Renderer(base.Renderer):
+    """Portlet renderer.
+
+    This is registered in configure.zcml. The referenced page template is
+    rendered, and the implicit variable 'view' will refer to an instance
+    of this class. Other methods can be added and referenced in the template.
+    """
+
+    render = ViewPageTemplateFile('mostcommented.pt')
+
+    @property
+    def days(self):
+        return self.data.period
+
+    @property
+    @memoize
+    def mostCommented(self):
+        catalog = getMultiAdapter((self.context, self.request), name=u'plone_tools').catalog()
+        pstate = getMultiAdapter((self.context, self.request), name=u'plone_portal_state')
+        portal_id = pstate.portal().getId()
+        brains = catalog(path='/%s/%s' % (portal_id, self.data.blog),
+                         portal_type='Discussion Item',
+                         review_state='published',
+                         created={'query':DateTime() - self.data.period, 
+                                  'range':'min'}
+                        )
+        # count comments per blogpost
+        comments = {}
+        for b in brains:
+            bep = '/'.join(b.getPath().split('/')[:-2])
+            comments.setdefault(bep, 0)
+            comments[bep] = comments[bep] + 1
+        # sort blogpost_pathes by comment number
+        sorted_dict = list(comments.iteritems())
+        sorted_dict.sort(lambda i1, i2: cmp(i1[1], i2[1]))
+        sorted_dict.reverse()
+        mcpathes = [k for k,v in sorted_dict[:self.data.limit]]
+        # get mostcommented blogpost brains
+        mostcommented = catalog(path={'query':mcpathes, 'depth':0})
+        mcomm_dict = dict([(b.getPath(),b) for b in mostcommented])
+        # associate comment number with appropriate blogpost brain
+        res = [(n,mcomm_dict[p]) for p,n in sorted_dict if p in mcomm_dict.keys()]
+        return res
+
+# NOTE: If this portlet does not have any configurable parameters, you can
+# inherit from NullAddForm and remove the form_fields variable.
+
+class AddForm(base.AddForm):
+    """Portlet add form.
+
+    This is registered in configure.zcml. The form_fields variable tells
+    zope.formlib which fields to display. The create() method actually
+    constructs the assignment that is being added.
+    """
+    form_fields = form.Fields(IMostCommented)
+
+    def create(self, data):
+        return Assignment(**data)
+
+
+# NOTE: IF this portlet does not have any configurable parameters, you can
+# remove this class definition and delete the editview attribute from the
+# <plone:portlet /> registration in configure.zcml
+
+class EditForm(base.EditForm):
+    """Portlet edit form.
+
+    This is registered with configure.zcml. The form_fields variable tells
+    zope.formlib which fields to display.
+    """
+    form_fields = form.Fields(IMostCommented)
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/overrides.zcml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/overrides.zcml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/overrides.zcml	(revision 762)
@@ -0,0 +1,51 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:plone="http://namespaces.plone.org/plone"
+    i18n_domain="quintagroup.quills.extras">
+
+    <plone:portlet
+        name="quills.app.portlets.WeblogAdmin"
+        interface=".weblogadmin.IWeblogAdminPortlet"
+        assignment=".weblogadmin.Assignment"
+        renderer=".weblogadmin.CustomRenderer"
+        addview=".weblogadmin.AddForm"
+        editview=".weblogadmin.EditForm"
+        />
+
+  <plone:portlet
+      name="quills.app.portlets.Authors"
+      interface="quills.app.portlets.authors.IWeblogAuthorsPortlet"
+      assignment="quills.app.portlets.authors.Assignment"
+      renderer=".patch_renderers.AuthorRenderer"
+      addview="quills.app.portlets.authors.AddForm"
+      editview="quills.app.portlets.authors.EditForm"
+      />
+
+  <plone:portlet
+      name="quills.app.portlets.RecentComments"
+      interface="quills.app.portlets.recentcomments.IRecentWeblogCommentsPortlet"
+      assignment="quills.app.portlets.recentcomments.Assignment"
+      renderer=".patch_renderers.RecentCommentsRenderer"
+      addview="quills.app.portlets.recentcomments.AddForm"
+      editview="quills.app.portlets.recentcomments.EditForm"
+      />
+
+  <plone:portlet
+      name="quills.app.portlets.RecentEntries"
+      interface="quills.app.portlets.recententries.IRecentWeblogEntriesPortlet"
+      assignment="quills.app.portlets.recententries.Assignment"
+      renderer=".patch_renderers.RecentEntriesRenderer"
+      addview="quills.app.portlets.recententries.AddForm"
+      editview="quills.app.portlets.recententries.EditForm"
+      />
+
+  <plone:portlet
+      name="quills.app.portlets.WeblogArchive"
+      interface="quills.app.portlets.archive.IWeblogArchivePortlet"
+      assignment="quills.app.portlets.archive.Assignment"
+      renderer=".archive.Renderer"
+      addview="quills.app.portlets.archive.AddForm"
+      editview="quills.app.portlets.archive.EditForm"
+      />
+
+</configure>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/patch_renderers.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/patch_renderers.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/patch_renderers.py	(revision 762)
@@ -0,0 +1,19 @@
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+from quills.app.portlets.authors import Renderer as AuthorBaseRenderer
+from quills.app.portlets.recentcomments import Renderer as RecentCommentsBaseRenderer
+from quills.app.portlets.recententries import Renderer as RecentEntriesBaseRenderer
+
+
+class AuthorRenderer(AuthorBaseRenderer):
+
+    _template = ViewPageTemplateFile('authors.pt')
+
+class RecentCommentsRenderer(RecentCommentsBaseRenderer):
+
+    _template = ViewPageTemplateFile('recentcomments.pt')
+
+class RecentEntriesRenderer(RecentEntriesBaseRenderer):
+
+    _template = ViewPageTemplateFile('weblogrecententries.pt')
+
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/quillslinks.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/quillslinks.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/quillslinks.pt	(revision 762)
@@ -0,0 +1,45 @@
+<dl class="portlet portletQuillsLinks"
+    i18n:domain="quills.app"
+    tal:define="weblog         python:view.getWeblog();
+                weblog_content python:view.getWeblogContentObject();
+                portal_url            view/portal_url;">
+
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span class="tile"
+              tal:content="view/title">_title_</span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+        <dd class="portletItem odd" id="quills-portlet-atom">
+          <a href="#"
+             tal:attributes="href string:${weblog_content/absolute_url}/atom.xml">
+            <img src="" 
+                 height="15" 
+                 width="80" 
+                 alt="Atom"
+                 title="Atom Enabled" 
+                 i18n:attributes="alt; title"
+                 tal:attributes="src string:$portal_url/atom_feed.gif" />
+          </a>
+        </dd>
+
+        <dd class="portletItem even" id="quills-portlet-rss">
+          <a href=""
+             tal:attributes="href string:${weblog_content/absolute_url}/rss.xml">
+            <img src="" 
+                 height="15" 
+                 width="80" 
+                 alt="RSS 2.0"
+                 title="RSS 2.0 feed" 
+                 i18n:attributes="alt; title"
+                 tal:attributes="src string:$portal_url/rss_feed.gif" />
+          </a>
+        </dd>
+
+        <dd class="portletFooter">
+          <span class="portletBottomLeft"></span>
+          <span class="portletBottomRight"></span>
+        </dd>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recentcomments.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recentcomments.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recentcomments.pt	(revision 762)
@@ -0,0 +1,23 @@
+<dl class="portlet portletRecentComments"
+    tal:define="comments view/getComments;">
+
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span class="tile"
+              tal:content="view/title">_title_</span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <tal:block repeat="comment comments">
+
+      <dd class="portletItem odd"
+          tal:attributes="class python:repeat['comment'].odd() and 'portletItem even' or 'portletItem odd'">
+
+          <a href="" tal:attributes="href python:view.talkbackURL(comment)">
+              <span tal:replace ="comment/Title">foo</span>
+              <tal:author tal:condition="comment/Creator"> (<span tal:replace="comment/Creator">user</span>)</tal:author></a>
+      </dd>
+
+    </tal:block>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recententries.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recententries.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recententries.pt	(revision 762)
@@ -0,0 +1,27 @@
+<dl class="portlet portletRecentEntries">
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span class="tile"
+              tal:content="view/title">_title_</span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <tal:block repeat="entry view/getEntries">
+
+      <dd class="portletItem odd"
+          tal:attributes="class python:repeat['entry'].odd() and 'portletItem even' or 'portletItem odd'">
+
+        <a href="#"
+           tal:attributes="href python:view.getArchiveURLFor(entry)"
+           tal:content="entry/getTitle">_title_</a>
+
+      </dd>
+
+    </tal:block>
+
+    <dd class="portletFooter">
+        <span class="portletBottomLeft"></span>
+        <span class="portletBottomRight"></span>
+    </dd>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recententries.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recententries.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/recententries.py	(revision 762)
@@ -0,0 +1,83 @@
+from zope import schema
+from zope.formlib import form
+from zope.interface import implements
+from zope.component import getMultiAdapter
+
+from plone.memoize.instance import memoize
+from plone.app.portlets.portlets import base
+from plone.memoize.compress import xhtml_compress
+from plone.portlets.interfaces import IPortletDataProvider
+
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+# Quills imports
+from quills.core.interfaces import IWeblog
+from quills.core.interfaces import IWeblogLocator
+from quills.app.browser.baseview import BaseView
+from quills.app.portlets.base import BasePortletRenderer
+
+from quintagroup.quills.extras import quintagroupQuillsMessageFactory as _
+
+PORTLET_TITLE = _(u"Recent Posts")
+PORTLET_DESC = _(u"This portlet lists recent posts for specified weblog.")
+
+class IRecentWeblogEntriesPortlet(IPortletDataProvider):
+
+    blog = schema.TextLine(
+        title=_(u"Path to Blog"),
+        description=_(u"Physical path to blog, from the plone object, 'blog' for ex."),
+        required=True)
+
+    max_entries = schema.Int(
+        title=_(u'Maximum entries'),
+        description=_(u"What's the maximum number of entries to list?"),
+        required=True,
+        default=5)
+
+class Assignment(base.Assignment):
+
+    implements(IRecentWeblogEntriesPortlet)
+
+    def __init__(self, blog='blog', max_entries=5):
+        self.blog = blog
+        self.max_entries = max_entries
+
+    @property
+    def title(self):
+        return PORTLET_TITLE
+
+
+class Renderer(BasePortletRenderer, base.Renderer, BaseView):
+
+    _template = ViewPageTemplateFile('recententries.pt')
+
+    @property
+    def title(self):
+        return PORTLET_TITLE
+
+    @memoize
+    def getWeblog(self):
+        pstate = getMultiAdapter((self.context, self.request), name=u'plone_portal_state')
+        portal = pstate.portal()
+        weblog = portal.restrictedTraverse(self.data.blog)
+        return IWeblog(weblog)
+
+    @property
+    def getEntries(self):
+        weblog = self.getWeblog()
+        return weblog.getEntries(maximum=self.data.max_entries)
+
+
+class AddForm(base.AddForm):
+    form_fields = form.Fields(IRecentWeblogEntriesPortlet)
+    label = _(u'add-portlet', default=u"Add ${portlet-name} Portlet", mapping={u'portlet-name': PORTLET_TITLE})
+    description = PORTLET_DESC
+
+    def create(self, data):
+        return Assignment(blog='blog', max_entries=5)
+
+
+class EditForm(base.EditForm):
+    form_fields = form.Fields(IRecentWeblogEntriesPortlet)
+    label = _(u'edit-portlet', default=u"Edit ${portlet-name} Portlet", mapping={u'portlet-name': PORTLET_TITLE})
+    description = PORTLET_DESC
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogadmin.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogadmin.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogadmin.pt	(revision 762)
@@ -0,0 +1,45 @@
+<dl class="portlet portletWeblogAdmin"
+    i18n:domain="quills.app">
+
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span class="tile"
+              tal:content="view/title">_title_</span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <dd class="portletItem odd">
+       <form method="get" action="http://localhost:10232/www/blog">
+	 <select class="form-element" 
+           onchange="javascript:location.href='blog/'+this.options[this.selectedIndex].value+'/createObject?type_name=Document'"
+           name=":action"
+           tal:attributes="onchange string:javascript:location.href='${view/weblog_url}/'+this.options[this.selectedIndex].value+'${view/creation_url}'">
+           <option value="">..where to add..</option>
+	   <option value="">To blog's root</option>
+           <tal:loop-options repeat="option view/categories">
+	   <option value="blogging"
+                   tal:attributes="value option"
+                   tal:content="string:To $option">To blogging/google</option>
+           </tal:loop-options>
+	 </select>
+       </form>
+
+    </dd>
+    <dd class="portletItem even">
+       <a title="Manage Comments" href="#"
+        i18n:translate="portlet_blogadmin_manage_comments"
+        i18n:attributes="title"
+        tal:attributes="href view/manage_comments_url">
+        Manage Comments
+       </a>
+    </dd>
+    <dd class="portletItem odd">
+       <a title="Configure Blog" href="#"
+        i18n:translate="portlet_blogadmin_configure_blog"
+        i18n:attributes="title"
+        tal:attributes="href view/config_view_url">
+        Configure Blog
+       </a>
+    </dd>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogadmin.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogadmin.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogadmin.py	(revision 762)
@@ -0,0 +1,40 @@
+from plone.memoize import ram
+from Products.CMFCore.utils import getToolByName
+from quills.app.portlets.weblogadmin import *
+#from plone.app.portlets.cache import render_cachekey
+
+def _categroies_key(method, self):
+    return self.context.getPhysicalPath()
+
+class CustomRenderer(Renderer):
+
+    _template = ViewPageTemplateFile('weblogadmin.pt')
+
+    @property
+    def weblog_url(self):
+        weblog_content = self.getWeblogContentObject()
+        return weblog_content.absolute_url()
+
+    @property
+    @ram.cache(_categroies_key)
+    def creation_url(self):
+        weblog_content = self.getWeblogContentObject()
+        try:
+            config = IWeblogEnhancedConfiguration(weblog_content)
+            type_name = config.default_type
+        except TypeError: # Could not adapt, so fall back to default.
+            type_name = 'WeblogEntry'
+        return "/createObject?type_name=%s" % type_name
+
+    @ram.cache(_categroies_key)
+    def categories(self):
+        weblog_content = self.getWeblogContentObject()
+        catalog = getToolByName(self.context, 'portal_catalog')
+        bfolders = catalog(
+            path='/'.join(weblog_content.getPhysicalPath()),
+            portal_type=['Folder','Large Plone Folder'],
+        )
+        wc_path_len = len('/'.join(weblog_content.getPhysicalPath()))
+        cats = [b.getPath()[wc_path_len+1:] for b in bfolders if not len(b.getPath())==wc_path_len ]
+        return cats
+                
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogrecententries.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogrecententries.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/portlets/weblogrecententries.pt	(revision 762)
@@ -0,0 +1,27 @@
+<dl class="portlet portletRecentEntries">
+    <dt class="portletHeader">
+        <span class="portletTopLeft"></span>
+        <span class="tile"
+              tal:content="view/title">_title_</span>
+        <span class="portletTopRight"></span>
+    </dt>
+
+    <tal:block repeat="entry view/getEntries">
+
+      <dd class="portletItem odd"
+          tal:attributes="class python:repeat['entry'].odd() and 'portletItem even' or 'portletItem odd'">
+
+        <a href="#"
+           tal:attributes="href python:view.getArchiveURLFor(entry)"
+           tal:content="entry/getTitle">_title_</a>
+
+      </dd>
+
+    </tal:block>
+
+    <dd class="portletFooter">
+        <span class="portletBottomLeft"></span>
+        <span class="portletBottomRight"></span>
+    </dd>
+
+</dl>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/contentrules.xml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/contentrules.xml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/contentrules.xml	(revision 762)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<contentrules>
+ <rule name="rule-1" title="Add_blog_content" description="" enabled="True"
+    event="zope.app.container.interfaces.IObjectAddedEvent"
+    stop-after="False">
+  <conditions>
+   <condition type="plone.conditions.PortalType">
+    <property name="check_types">
+     <element>Document</element>
+    </property>
+   </condition>
+  </conditions>
+  <actions>
+   <action type="plone.actions.Workflow">
+    <property name="transition">update_layout</property>
+   </action>
+  </actions>
+ </rule>
+ <assignment name="rule-1" bubbles="True" enabled="True" location=""/>
+</contentrules>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/jsregistry.xml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/jsregistry.xml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/jsregistry.xml	(revision 762)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<object name="portal_javascripts" meta_type="JavaScripts Registry">
+ <javascript cacheable="True" compression="safe" cookable="True"
+    enabled="True" expression="python:request.get('print',None)=='1'"
+    id="++resource++print_blogentry.js" inline="False"
+    insert-bottom="True"/>
+ <javascript cacheable="True" compression="safe" cookable="True"
+    enabled="True" expression=""
+    id="++resource++addthis_common.js" inline="False"
+    insert-bottom="True"/>
+</object>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/metadata.xml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/metadata.xml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/metadata.xml	(revision 762)
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<metadata>
+  <version>1.3.2</version>
+</metadata>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/portlets.xml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/portlets.xml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/portlets.xml	(revision 762)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!-- This file is used to register new types of portlets. It can also
+     be used to register completely new column types. See CMFPlone's version
+     of this file for more information.
+  -->
+<portlets>
+  <!-- -*- extra stuff goes here -*- -->
+
+   <portlet
+     addview="quintagroup.quills.extras.Categories"
+     title="Weblog Categories"
+     description="List of Weblog's subfolder"
+   />
+
+   <portlet
+     addview="quintagroup.quills.extras.MostCommented"
+     title="Most Commented"
+     description="Render Most Commented Blog Posts"
+   />
+
+   <portlet
+     addview="quintagroup.quills.extras.ResentPosts"
+     title="Resent Posts"
+     description="Render Resent Blog Posts"
+   />
+
+</portlets>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/skins.xml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/skins.xml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/skins.xml	(revision 762)
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<object name="portal_skins">
+
+  <object name="quills_extras"
+          meta_type="Filesystem Directory View"
+          directory="quintagroup.quills.extras:skins/quills_extras"/>
+
+  <skin-path name="*">
+   <layer name="quills_extras"
+          insert-after="custom" />
+  </skin-path>
+
+</object>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/workflows/simple_publication_workflow/definition.xml
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/workflows/simple_publication_workflow/definition.xml	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/profiles/default/workflows/simple_publication_workflow/definition.xml	(revision 762)
@@ -0,0 +1,248 @@
+<?xml version="1.0"?>
+<dc-workflow workflow_id="simple_publication_workflow"
+             title="Simple Publication Workflow"
+             description=" - Simple workflow that is useful for basic web sites. - Things start out as private, and can either be submitted for review, or published directly. - The creator of a content item can edit the item even after it is published."
+             state_variable="review_state"
+             initial_state="private">
+ <permission>Access contents information</permission>
+ <permission>Change portal events</permission>
+ <permission>List folder contents</permission>
+ <permission>Modify portal content</permission>
+ <permission>View</permission>
+ <state state_id="pending" title="Pending review">
+  <description>Waiting to be reviewed, not editable by the owner.
+</description>
+  <exit-transition transition_id="make_private"/>
+  <exit-transition transition_id="publish"/>
+  <exit-transition transition_id="reject"/>
+  <exit-transition transition_id="retract"/>
+  <permission-map name="Access contents information"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+   <permission-role>Reader</permission-role>
+   <permission-role>Contributor</permission-role>
+   <permission-role>Reviewer</permission-role>
+  </permission-map>
+  <permission-map name="Change portal events"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Reviewer</permission-role>
+  </permission-map>
+  <permission-map name="List folder contents"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+   <permission-role>Reader</permission-role>
+   <permission-role>Contributor</permission-role>
+   <permission-role>Reviewer</permission-role>
+  </permission-map>
+  <permission-map name="Modify portal content"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Reviewer</permission-role>
+  </permission-map>
+  <permission-map name="View" acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+   <permission-role>Reader</permission-role>
+   <permission-role>Contributor</permission-role>
+   <permission-role>Reviewer</permission-role>
+  </permission-map>
+ </state>
+ <state state_id="private" title="Private">
+  <description>Can only be seen and edited by the owner.
+</description>
+  <exit-transition transition_id="publish"/>
+  <exit-transition transition_id="submit"/>
+  <exit-transition transition_id="update_layout"/>
+  <permission-map name="Access contents information"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+   <permission-role>Reader</permission-role>
+   <permission-role>Contributor</permission-role>
+  </permission-map>
+  <permission-map name="Change portal events"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+  </permission-map>
+  <permission-map name="List folder contents"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+   <permission-role>Reader</permission-role>
+   <permission-role>Contributor</permission-role>
+  </permission-map>
+  <permission-map name="Modify portal content"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+  </permission-map>
+  <permission-map name="View" acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+   <permission-role>Reader</permission-role>
+   <permission-role>Contributor</permission-role>
+  </permission-map>
+ </state>
+ <state state_id="published" title="Published">
+  <description>Visible to everyone, not editable by the owner.
+</description>
+  <exit-transition transition_id="retract"/>
+  <exit-transition transition_id="reject"/>
+  <exit-transition transition_id="update_layout"/>
+  <permission-map name="Access contents information"
+                  acquired="False">
+   <permission-role>Anonymous</permission-role>
+  </permission-map>
+  <permission-map name="Change portal events"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+  </permission-map>
+  <permission-map name="List folder contents"
+                  acquired="False">
+   <permission-role>Anonymous</permission-role>
+  </permission-map>
+  <permission-map name="Modify portal content"
+                  acquired="False">
+   <permission-role>Manager</permission-role>
+   <permission-role>Owner</permission-role>
+   <permission-role>Editor</permission-role>
+  </permission-map>
+  <permission-map name="View" acquired="False">
+   <permission-role>Anonymous</permission-role>
+  </permission-map>
+ </state>
+ <transition transition_id="publish"
+             title="Reviewer publishes content"
+             new_state="published" trigger="USER"
+             before_script="" after_script="">
+  <description>Publishing the item makes it visible to other users.
+</description>
+  <action url="%(content_url)s/content_status_modify?workflow_action=publish"
+          category="workflow">Publish</action>
+  <guard>
+   <guard-permission>Review portal content</guard-permission>
+  </guard>
+ </transition>
+ <transition transition_id="reject"
+             title="Reviewer send content back for re-drafting"
+             new_state="private" trigger="USER"
+             before_script="" after_script="">
+  <description>Sending the item back will return the item to the original author instead of publishing it. You should preferably include a reason for why it was not published.
+</description>
+  <action url="%(content_url)s/content_status_modify?workflow_action=reject"
+          category="workflow">Send back</action>
+  <guard>
+   <guard-permission>Review portal content</guard-permission>
+  </guard>
+ </transition>
+ <transition transition_id="retract"
+             title="Member retracts submission"
+             new_state="private" trigger="USER"
+             before_script="" after_script="">
+  <description>If you submitted the item by mistake or want to perform additional edits, this will take it back.
+</description>
+  <action url="%(content_url)s/content_status_modify?workflow_action=retract"
+          category="workflow">Retract</action>
+  <guard>
+   <guard-permission>Request review</guard-permission>
+  </guard>
+ </transition>
+ <transition transition_id="submit"
+             title="Member submits content for publication"
+             new_state="pending" trigger="USER"
+             before_script="" after_script="">
+  <description>Puts your item in a review queue, so it can be published on the site.
+</description>
+  <action url="%(content_url)s/content_status_modify?workflow_action=submit"
+          category="workflow">Submit for publication</action>
+  <guard>
+   <guard-permission>Request review</guard-permission>
+  </guard>
+ </transition>
+ <transition transition_id="update_layout" title=""
+             new_state="" trigger="USER" before_script=""
+             after_script="set_layout">
+  
+  <guard>
+  </guard>
+ </transition>
+ <worklist worklist_id="reviewer_queue" title="">
+  <description>Reviewer tasks</description>
+  <action url="%(portal_url)s/search?review_state=pending"
+          category="global">Pending (%(count)d)</action>
+  <guard>
+   <guard-permission>Review portal content</guard-permission>
+  </guard>
+  <match name="review_state" values="pending"/>
+ </worklist>
+ <variable variable_id="action" for_catalog="False"
+           for_status="True" update_always="True">
+  <description>Previous transition</description>
+  <default>
+   
+   <expression>transition/getId|nothing</expression>
+  </default>
+  <guard>
+  </guard>
+ </variable>
+ <variable variable_id="actor" for_catalog="False"
+           for_status="True" update_always="True">
+  <description>The ID of the user who performed the previous transition</description>
+  <default>
+   
+   <expression>user/getUserName</expression>
+  </default>
+  <guard>
+  </guard>
+ </variable>
+ <variable variable_id="comments" for_catalog="False"
+           for_status="True" update_always="True">
+  <description>Comment about the last transition</description>
+  <default>
+   
+   <expression>python:state_change.kwargs.get('comment', '')</expression>
+  </default>
+  <guard>
+  </guard>
+ </variable>
+ <variable variable_id="review_history" for_catalog="False"
+           for_status="False" update_always="False">
+  <description>Provides access to workflow history</description>
+  <default>
+   
+   <expression>state_change/getHistory</expression>
+  </default>
+  <guard>
+   <guard-permission>Request review</guard-permission>
+   <guard-permission>Review portal content</guard-permission>
+  </guard>
+ </variable>
+ <variable variable_id="time" for_catalog="False"
+           for_status="True" update_always="True">
+  <description>When the previous transition was performed</description>
+  <default>
+   
+   <expression>state_change/getDateTime</expression>
+  </default>
+  <guard>
+  </guard>
+ </variable>
+ <script script_id="set_layout" type="External Method"
+         filename=""
+         module="quintagroup.quills.extras.utils"
+         function="set_layout"/>
+</dc-workflow>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/batch_macros.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/batch_macros.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/batch_macros.pt	(revision 762)
@@ -0,0 +1,59 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      i18n:domain="plone">
+<body>
+
+<!-- Navigation -->
+<div class="listingBar"
+     metal:define-macro="navigation"
+     tal:define="request request|here/request|container/request|nothing;
+                 batch batch|nothing;
+                 template_id template_id|template/getId;
+                 mq python:modules['ZTUtils'].make_query;
+                 url batch_base_url | string:${here/absolute_url}/${template_id};
+                 currentpage batch/pagenumber;"
+     tal:condition="python: batch.next or  batch.previous">
+<!-- TODO tesdal needs to have a look at these
+    <metal:rellinks fill-slot="rel_slot">
+        <link rel="first" href="" title="First page" tal:attributes="href string:author" />
+        <link rel="last" href="" title="Last page" tal:attributes="href string:author" />
+        <link rel="previous" href="" title="Previous page" tal:attributes="href string:author" />
+        <link rel="next" href="" title="Next page" tal:attributes="href string:author" />
+    </metal:rellinks>
+-->
+    <span class="previous"
+      tal:define="p batch/previous | nothing"
+      tal:condition="p">
+        <a href=""
+           tal:attributes="href python: '%s?%s' % (url , mq( request.form, {batch.b_start_str:p.first} ))">
+           &laquo;
+           <span i18n:translate="batch_previous_x_items" tal:omit-tag="">
+               Previous
+               <span i18n:name="number" tal:omit-tag="" tal:content="p/length">n</span>
+               items
+           </span>
+        </a>
+    </span> 
+
+    <span class="next"
+      tal:define="n batch/next | nothing"
+      tal:condition="n">
+        <a href=""
+           tal:attributes="href python: '%s?%s' % (url , mq( request.form, {batch.b_start_str:n.first} ))">
+           <span i18n:translate="batch_next_x_items" tal:omit-tag="">
+               Next
+               <span i18n:name="number" tal:omit-tag="" tal:content="n/length">n</span>
+               items
+           </span>
+           &raquo;
+        </a>
+    </span>
+
+    <span><br/></span>
+
+</div>
+
+</body>
+</html>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/entry_macros.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/entry_macros.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/entry_macros.pt	(revision 762)
@@ -0,0 +1,385 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en-US" lang="en-US"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      i18n:domain="quills.app">
+  <head><title></title></head>
+  <body>
+
+    <tal:comment condition="nothing">
+      Collection of macros for displaying individual entries.
+
+      The main macro is display-entry, which you can pass some
+      parameters. The parameters are needed to be able to use this one
+      macro in a number of places: displaying one entry, main weblog
+      page, topic page.
+
+      By passing along some parameters we can keep the template clear
+      of all logic and settings-gathering.
+    </tal:comment>
+
+
+    <metal:displayEntry metal:define-macro="display-entry">
+      <tal:comment condition="nothing">
+        Displays one individual entry.
+
+        The macro is kept generic, so that it can be used in all places
+        where an entry needs to be displayed. Only a feed will use
+        something else.
+
+        The weblogentry_view template adds bells and whistles like
+        trackback, long comments, etc. Don't put those in here!
+      </tal:comment>
+      <div class="weblog-entry"
+           tal:define="second_level second_level | python:False;
+                       show_content show_content | python:True;
+                       entry nocall:entry | nothing;
+                       displaying_one_entry python:view.displayingOneEntry(context, entry);
+                       weblog nocall:weblog | python:entry.getWeblog();
+                       weblog_content nocall:weblog_content | python:entry.getWeblogContentObject()">
+        <tal:comment condition="nothing">
+          Parameters:
+
+          second_level - In listingviews, we're normally at h3. Only if
+          we're not grouped by dates we have to use h2. This setting
+          controls that.
+
+          For headings of level 1, which occur if 'displaying_one_entry'
+          is True, we won't make the header a link as it is the entry
+          itself that's being displayed. For headers of level 2 or 3
+          it will be clickable.
+
+          displaying_one_entry is True if the context's URL is the same
+          as the entry's URL.
+
+          show_content - Whether to show the actual content or just the
+          summary. Default: True.
+
+          entry - The actual entry.
+        </tal:comment>
+
+
+        <tal:comment condition="nothing"> title </tal:comment>
+        <tal:headerInListing tal:condition="displaying_one_entry">
+
+          <div tal:replace="structure provider:plone.abovecontenttitle" />
+          <h1 tal:content="entry/getTitle">
+            Level 1 title, not clickable
+          </h1>
+          <div tal:replace="structure provider:plone.abovecontentbody" />
+        </tal:headerInListing>
+        <tal:headerInListing tal:condition="not: displaying_one_entry">
+          <h2 tal:condition="second_level">
+            <a href=""
+               tal:attributes="href python:view.getArchiveURLFor(entry)"
+               tal:content="entry/Title">
+              Level 2 title, clickable
+            </a>
+          </h2>
+          <h2 tal:condition="not: second_level"
+              class="weblog-view-entry-title">
+            <a href=""
+               tal:attributes="href python:view.getArchiveURLFor(entry)"
+               tal:content="entry/getTitle">
+              Level 3 title, clickable
+            </a>
+          </h2>
+        </tal:headerInListing>
+
+        <tal:comment condition="nothing"> Topic images  </tal:comment>
+        <metal:macro use-macro="context/entry_macros/macros/topic-images"/>
+
+        <tal:comment condition="nothing"> Byline </tal:comment>
+        <tal:byline define="item_creator python:', '.join([each.getTitle() for each in entry.getAuthors()]);
+                            item_modified entry/getPublicationDate;">
+          <metal:macro use-macro="context/entry_macros/macros/short-byline" />
+        </tal:byline>
+        
+
+        <tal:comment condition="nothing"> Filed under </tal:comment>
+        <metal:macro use-macro="context/entry_macros/macros/filed-under"/>
+
+        <tal:comment condition="nothing"> Description
+        We add a special class (weblog-entry-only-excerpt) instead of
+        the normal docoumentDescription to allow for a different
+        formatting.
+        </tal:comment>
+        <tal:excerpt condition="not: show_content">
+          <p class="weblog-entry-only-excerpt">
+            <span
+                tal:condition="entry/getExcerpt"
+                tal:content="entry/getExcerpt" />
+            <span class="weblog-read-more">
+              <a href=""
+                 tal:attributes="href python:view.getArchiveURLFor(entry)"
+                 i18n:translate="read_more">
+                read more...
+              </a>
+            </span>
+          </p>
+        </tal:excerpt>
+        <tal:description condition="show_content">
+          <p class="documentDescription"
+             tal:condition="entry/getExcerpt"
+             tal:content="entry/getExcerpt">
+          </p>
+        </tal:description>
+
+        <tal:comment condition="nothing"> Main content </tal:comment>
+        <div class=""
+             tal:condition="python: entry.getText() and show_content"
+             tal:attributes="class python:test(entry.getMimeType() in ('text/structured', 'text/x-rst', ), 'stx', 'plain')"
+             tal:content="structure entry/getText">
+        </div>
+      </div>
+	  
+      <!--<tal:comment condition="nothing"> AddThis bookmarklet manager </tal:comment>-->
+      <!--<metal:macro use-macro="context/entry_macros/macros/addthis" />-->
+
+    </metal:displayEntry>
+
+    <metal:topicImages define-macro="topic-images">
+      <tal:comment condition="nothing">
+        Display the topic images
+
+        It is the responsibility of this macro to determine whether to
+        display the images.
+      </tal:comment>
+      <div class="weblog-topic-images"
+           tal:define="entry nocall:entry|nothing;
+                       weblog nocall:weblog|nothing;
+                       topics entry/getTopics"
+           tal:condition="topics">
+
+        <tal:comment condition="nothing">
+          Parameters
+
+          entry - The entry being displayed
+          weblog - The parent weblog
+        </tal:comment>
+
+        <tal:categories repeat="topic topics">
+          <a href=""
+             tal:attributes="href string:${weblog_content/absolute_url}/topics/${topic/getId}">
+            <img class="topic-image"
+                 src=""
+                 alt=""
+                 title=""
+                 tal:define="topicimage topic/getImage"
+                 tal:condition="python: topicimage"
+                 tal:attributes="src topicimage/absolute_url;
+                                 title topic/title_or_id;
+                                 alt topic/title_or_id;" />
+          </a>
+        </tal:categories>
+      </div>
+    </metal:topicImages>
+
+    <metal:filedUnder metal:define-macro="filed-under">
+      <tal:comment condition="nothing">
+        Display the "filed under" list.
+
+        The template uses a 'ul' list to get good plone-like
+        semantics. Handy for google ratings. CSS should turn it into
+        something usable.
+      </tal:comment>
+      <div class="weblog-topics"
+           tal:define="entry nocall:entry|nothing;
+                       weblog_content nocall:weblog_content|nothing;
+                       topics entry/getTopics"
+           tal:condition="topics">
+        <tal:comment condition="nothing">
+          Parameters
+
+          entry - The entry being displayed
+          weblog_content - The parent weblog
+        </tal:comment>
+
+        <div class="weblog-topics-label"
+             i18n:translate="filed_under">
+          Filed Under:
+        </div>
+        <ul>
+          <li tal:repeat="topic topics">
+            <a href=""
+               tal:content="topic/getTitle"
+               tal:attributes="href
+                               string:${weblog_content/absolute_url}/topics/${topic/getId}">
+              Link to the topic
+            </a>
+          </li>
+        </ul>
+      </div>
+    </metal:filedUnder>
+
+    <metal:discussion define-macro="discussion-summary">
+      <div class="belowentryItem"
+           tal:define="displaying_one_entry python:view.displayingOneEntry(context, entry);
+                       isDiscussionAllowedFor nocall:view/isDiscussionAllowedFor;">
+        <tal:if condition="python:isDiscussionAllowedFor(entry)">
+          <tal:single tal:condition="displaying_one_entry">
+            <a href=""
+               name="comments"
+               tal:attributes="href python:'%s#comments' % view.getArchiveURLFor(entry)">
+              <span i18n:translate="number_of_comments">Comments:</span>
+              <span tal:content="python:view.getCommentCountFor(entry)">0</span>
+            </a>
+          </tal:single>
+          <tal:single tal:condition="not: displaying_one_entry">
+            <a href=""
+               tal:attributes="href python:'%s#comments' % view.getArchiveURLFor(entry)"
+               i18n:translate="number_of_comments">
+              <img src="../comments.gif"
+                   tal:attributes="src string:${portal_url}/comments.gif"
+                   width="18" height="15" border="0" alt="Comments" />
+              <span i18n:translate="number_of_comments">Comments:</span>
+              <span tal:content="python:view.getCommentCountFor(entry)">0</span>
+            </a>
+          </tal:single>
+        </tal:if>
+      </div>
+    </metal:discussion>
+    
+    <metal:byline define-macro="byline">
+      <tal:showme tal:condition="wvconfig/show_about">
+        <div class="documentByLine"
+             tal:define="item_creator item_creator | nothing;
+			             authors python:item_creator and [item_creator,] or entry.getAuthors();">
+            <span i18n:translate="label_by_author">
+              by
+			</span>
+			<tal:block repeat="author authors">
+            <a href="#"
+			   tal:define="author_id python:str(author);
+                           ploneauthor python:mtool.getMemberInfo(author_id)"
+               tal:attributes="href string:${weblog_content/absolute_url}/authors/${author_id}"
+               tal:content="python:ploneauthor and ploneauthor['fullname'] or author_id">
+              Mister Dobalina, Mister Bob Dobalina
+            </a> 
+			</tal:block>
+          
+          &mdash;
+          <tal:mod i18n:translate="box_last_modified">
+            last modified
+          </tal:mod>
+          <span tal:define="item_modified item_modified | entry/getPublicationDate;"
+		        tal:replace="python:toLocalizedTime(item_modified,long_format=1)">
+            August 16, 2001 at 23:35:59
+          </span>
+        </div>
+		
+      </tal:showme>
+    </metal:byline>
+
+    <metal:addthis define-macro="addthis">
+        <div class="belowentryItem"
+                i18n:domain="plone"
+                tal:condition="not:nothing">
+            <a href="http://www.addthis.com/bookmark.php?v=20"
+                onmouseover="return addthis_open(this, '', '[URL]', '[TITLE]');"
+                onmouseout="addthis_close();" 
+                onclick="return addthis_sendto();"
+                tal:define="post_url python:view.getArchiveURLFor(entry)"
+                tal:attributes="onmouseover string:return addthis_open(this, '', '$post_url', '${entry/getTitle}');;;">
+                <img src="http://s7.addthis.com/static/btn/sm-plus.gif"
+                    width="16" height="16" border="0" alt="Bookmark and Share" />
+                Share/Bookmark
+            </a>
+            <script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"></script>
+        </div>	
+    </metal:addthis>
+
+    <div metal:define-macro="relatedItems"
+      class="relatedItems"
+      tal:define="getInfoFor python:wtool.getInfoFor;">
+        <tal:relatedItems tal:define="related python:here.computeRelatedItems();">
+            <tal:block tal:condition="python:related">
+                <div class="visualClear" id="clear-space-before-relatedItemBox"><!-- --></div>
+                <fieldset id="relatedItemBox">
+                    <legend>Related Stories</legend>
+                    <ul class="visualNoMarker">
+                    <tal:related tal:repeat="item related"
+                                 tal:define="use_view_action site_properties/typesUseViewActionInListings|python:();">
+                        <li tal:define="
+                                desc                item/Description;
+                                item_icon           python:plone_view.getIcon(item);
+                                item_type           item/portal_type;
+                                item_type_class     python:'contenttype-' + normalizeString(item_type);
+                                item_wf_state       item/review_state|python: getInfoFor(item, 'review_state', '');
+                                item_wf_state_class python: 'state-' + normalizeString(item_wf_state);
+                                item_url            item/absolute_url;
+                                item_url            python:test((item_type in use_view_action), item_url+'/view', item_url)">
+                            <span tal:attributes="class item_type_class">
+                                <a href="" class=""
+                                   tal:attributes="href  item_url;
+                                                   title item/Description;
+                                                   class string:$item_wf_state_class"
+                                   tal:content="item/pretty_title_or_id">
+                                    Related Item
+                                </a>
+                            </span>
+                        </li>
+                    </tal:related>
+                    </ul>
+                </fieldset>
+            </tal:block>
+          </tal:relatedItems>
+    </div>
+
+    <metal:otheractions define-macro="other-actions">
+        <div class="belowentryItem"
+                i18n:domain="plone">
+            <a href="sendto_form"
+                tal:attributes="href string:${entry/getURL}/sendto_form;">
+                <img src="mail_icon.gif" alt="Send this"
+                        tal:attributes="src string:$portal_url/mail_icon.gif" />
+                Send To
+            </a>
+        </div>	
+        <div class="belowentryItem"
+                i18n:domain="plone">
+            <a href="print"
+                tal:attributes="href string:${entry/getURL}/?print=1;">
+                <img src="mail_icon.gif" alt="Print this"
+                        tal:attributes="src string:$portal_url/print_icon.gif" />
+                Print page
+            </a>
+        </div>	
+    </metal:otheractions>
+
+
+    <metal:belowentry define-macro="belowentry">
+    <div class="blogSummaryThis">
+        <div class="blogSummaryThis-lining">
+            <metal:otheractions use-macro="context/entry_macros/macros/other-actions" />
+            <metal:addthis use-macro="context/entry_macros/macros/addthis"/>
+            <metal:discussion use-macro="context/entry_macros/macros/discussion-summary"/>
+        </div>
+    </div>
+    </metal:belowentry>
+
+    <metal:short-byline define-macro="short-byline">
+      <tal:showme tal:condition="wvconfig/show_about">
+        <div class="documentByLine"
+             tal:define="item_creator item_creator | nothing;
+			             authors python:item_creator and [item_creator,] or entry.getAuthors();">
+            <span i18n:translate="label_by_author">
+              by
+			</span>
+			<tal:block repeat="author authors">
+            <a href="#"
+			   tal:define="author_id python:str(author);
+                           ploneauthor python:mtool.getMemberInfo(author_id)"
+               tal:attributes="href string:${weblog_content/absolute_url}/authors/${author_id}"
+               tal:content="python:ploneauthor and ploneauthor['fullname'] or author_id">
+              Mister Dobalina, Mister Bob Dobalina
+            </a> 
+			</tal:block>
+        </div>
+		
+      </tal:showme>
+    </metal:short-byline>
+
+  </body>
+</html>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/quills_header_macros.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/quills_header_macros.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/quills_header_macros.pt	(revision 762)
@@ -0,0 +1,36 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en-US" lang="en-US"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      i18n:domain="quills.app">
+
+  <head>
+
+    <metal:block define-macro="feed-links">
+      <tal:block define="weblog_content python:view.getWeblogContentObject()">
+         <metal:block metal:use-macro="context/quills_header_macros/macros/feed-links-base"></metal:block>
+      </tal:block>
+    </metal:block>
+
+    <metal:block define-macro="feed-links-base">
+        <link
+            rel="alternate"
+            type="application/atom+xml"
+            title="Atom feed"
+            i18n:attributes="title"
+            tal:attributes="href string:${weblog_content/absolute_url}/atom.xml" />
+
+        <link
+            rel="alternate"
+            type="application/rss+xml"
+            title="RSS 2.0 feed"
+            i18n:attributes="title"
+            tal:attributes="href string:${weblog_content/absolute_url}/rss.xml" />
+    </metal:block>
+
+  </head>
+  <body>
+    
+  </body>
+</html>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/weblog_macros.pt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/weblog_macros.pt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/skins/quills_extras/weblog_macros.pt	(revision 762)
@@ -0,0 +1,74 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en-US" lang="en-US"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      i18n:domain="quills.app">
+
+  <head>
+    <title></title>
+  </head>
+  <body>
+
+    <metal:listEntries 
+        metal:define-macro="list-entries"
+        tal:define="wvconfig wvconfig | view/getConfig;
+                    results entries | weblog/getEntries;
+                    Batch python:modules['Products.CMFPlone'].Batch;
+                    b_size wvconfig/entries_per_page;
+                    b_start python:0;
+                    b_start request/b_start | b_start;
+                    batch python:Batch(results, b_size, int(b_start), orphan=1);
+                    results python:view.sortWeblogEntriesToDates(batch);
+                    show_content not:wvconfig/only_excerpt_in_weblog_view | nothing;
+                    group_by_dates wvconfig/group_by_dates | nothing;">
+
+      <tal:if condition="b_start">
+        <div metal:use-macro="context/batch_macros/macros/navigation" />
+      </tal:if>
+
+      <metal:block
+          tal:repeat="day python:view.getWeblogEntriesDates(results)">
+
+        <tal:byDates tal:condition="group_by_dates">
+          <div class="weblogViewDate">
+            <div tal:content="python:DateTime(day).strftime('%b').capitalize()"
+                     class="weblogDateMonth" />
+            <div tal:content="python:DateTime(day).day()" 
+                     class="weblogDateDay" />
+          </div>
+
+          <tal:entries repeat="entry python:results[day]">
+            <metal:macro use-macro="context/entry_macros/macros/display-entry"/>
+            <metal:macro use-macro="context/entry_macros/macros/belowentry"/>
+          </tal:entries>
+        </tal:byDates>
+
+        <tal:notByDates tal:condition="not: group_by_dates">
+          <tal:entries repeat="entry python:results[day]">
+            <tal:block tal:define="secondLevel python:True">
+	      <div class="weblogViewDate">
+		<div tal:content="python:DateTime(day).strftime('%b').capitalize()"
+			 class="weblogDateMonth" />
+		<div tal:content="python:DateTime(day).day()" 
+			 class="weblogDateDay" />
+	      </div>
+              <metal:macro use-macro="context/entry_macros/macros/display-entry"/>
+              <metal:macro use-macro="context/entry_macros/macros/belowentry"/>
+            </tal:block>
+          </tal:entries>
+        </tal:notByDates>
+
+      </metal:block>
+
+      <div metal:use-macro="context/batch_macros/macros/navigation" />
+
+      <div tal:condition="not: results">
+        <p i18n:translate="no_weblog_entries">
+          No weblog entries have been posted.
+        </p>
+      </div>
+    </metal:listEntries>
+    
+  </body>
+</html>
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/tests.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/tests.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/tests.py	(revision 762)
@@ -0,0 +1,54 @@
+import unittest
+
+from zope.testing import doctestunit
+from zope.component import testing
+from Testing import ZopeTestCase as ztc
+
+from Products.Five import zcml
+from Products.Five import fiveconfigure
+from Products.PloneTestCase import PloneTestCase as ptc
+from Products.PloneTestCase.layer import PloneSite
+ptc.setupPloneSite()
+
+import quintagroup.quills.extras
+
+class TestCase(ptc.PloneTestCase):
+    class layer(PloneSite):
+        @classmethod
+        def setUp(cls):
+            fiveconfigure.debug_mode = True
+            zcml.load_config('configure.zcml',
+                             quintagroup.quills.extras)
+            fiveconfigure.debug_mode = False
+
+        @classmethod
+        def tearDown(cls):
+            pass
+
+
+def test_suite():
+    return unittest.TestSuite([
+
+        # Unit tests
+        #doctestunit.DocFileSuite(
+        #    'README.txt', package='quintagroup.quills.extras',
+        #    setUp=testing.setUp, tearDown=testing.tearDown),
+
+        #doctestunit.DocTestSuite(
+        #    module='quintagroup.quills.extras.mymodule',
+        #    setUp=testing.setUp, tearDown=testing.tearDown),
+
+
+        # Integration tests that use PloneTestCase
+        #ztc.ZopeDocFileSuite(
+        #    'README.txt', package='quintagroup.quills.extras',
+        #    test_class=TestCase),
+
+        #ztc.FunctionalDocFileSuite(
+        #    'browser.txt', package='quintagroup.quills.extras',
+        #    test_class=TestCase),
+
+        ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
Index: /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/weblogfolder_patch.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/weblogfolder_patch.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/quintagroup/quills/extras/weblogfolder_patch.py	(revision 762)
@@ -0,0 +1,34 @@
+from zope.component.interface import interfaceToName
+from quills.core.interfaces import IPossibleWeblogEntry
+from quills.core.interfaces import IWeblogLocator
+from quills.app.interfaces import IWeblogEnhancedConfiguration
+from quills.app.weblogentrybrain import WeblogEntryCatalogBrain
+
+
+def getEntries(self, maximum=None, offset=0, path=None):
+    """See IWeblog.
+    """
+    catalog, portal = self._setCatalog()
+    catalog._catalog.useBrains(WeblogEntryCatalogBrain)
+    weblog = IWeblogLocator(self.context).find()
+    if getattr(weblog, 'context', None):
+        # `weblog' is presumably an adapter around the real content object.
+        weblog = weblog.context
+                                        
+    weblog_config = IWeblogEnhancedConfiguration(weblog)
+    path = path or '/'.join(self.context.getPhysicalPath())
+    results = catalog(
+        object_provides=interfaceToName(portal, IPossibleWeblogEntry),
+        path={ 'query' : path,
+               'level' : 0, },
+        sort_on='effective',
+        sort_order='reverse',
+        review_state={ 'query'    : weblog_config.published_states,
+                       'operator' : 'or'})
+    return self._filter(results, maximum, offset)
+
+
+from Products.QuillsEnabled.adapters.folder import Folder2Weblog
+
+
+Folder2Weblog.getEntries = getEntries
Index: /quintagroup.quills.extras/tags/1.3.2/setup.cfg
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/setup.cfg	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/setup.cfg	(revision 762)
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = dev
+tag_svn_revision = true
Index: /quintagroup.quills.extras/tags/1.3.2/setup.py
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/setup.py	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/setup.py	(revision 762)
@@ -0,0 +1,33 @@
+from setuptools import setup, find_packages
+import os
+
+version = '1.3.2'
+
+setup(name='quintagroup.quills.extras',
+      version=version,
+      description="Quintagroup products integration with quills",
+      long_description=open("README.txt").read() + "\n" +
+                       open(os.path.join("docs", "HISTORY.txt")).read(),
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[
+        "Framework :: Plone",
+        "Programming Language :: Python",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+        ],
+      keywords='quills quintagroup',
+      author='Quintagroup',
+      author_email='support@quintagroup.com',
+      url='http://svn.quintagroup.com/products/quintagroup.quills.extras',
+      license='GPL',
+      packages=find_packages(exclude=['ez_setup']),
+      namespace_packages=['quintagroup', 'quintagroup.quills'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+          'setuptools',
+          # -*- Extra requirements: -*-
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )
Index: /quintagroup.quills.extras/tags/1.3.2/zopeskel.txt
===================================================================
--- /quintagroup.quills.extras/tags/1.3.2/zopeskel.txt	(revision 762)
+++ /quintagroup.quills.extras/tags/1.3.2/zopeskel.txt	(revision 762)
@@ -0,0 +1,1 @@
+plone_app
