diff --git a/fields/calendar.py b/fields/calendar.py index aca207c..db42a9b 100644 --- a/fields/calendar.py +++ b/fields/calendar.py @@ -181,7 +181,7 @@ class Calendar(Field): -
+ |
|
@@ -71,7 +118,8 @@ class Pod(Field):
maxChars=None, colspan=1, master=None, masterValue=None,
focus=False, historized=False, mapping=None, label=None,
template=None, templateName=None, showTemplate=None,
- context=None, stylesMapping={}, formats=None):
+ freezeTemplate=None, context=None, stylesMapping={},
+ formats=None):
# Param "template" stores the path to the pod template(s).
if not template: raise Exception(Pod.NO_TEMPLATE)
if isinstance(template, basestring):
@@ -89,13 +137,48 @@ class Pod(Field):
# "template" contains several templates and "templateName" is None, Appy
# will produce names from template filenames.
self.templateName = templateName
- # "showTemplate", if specified, must be a method that will be called
- # with the current template as single arg and that must return True if
- # the template can be seen by the current user. "showTemplate" comes in
- # addition to self.show. self.show dictates the visibility of the whole
- # field (ie, all templates from self.template) while "showTemplate"
- # dictates the visiblity of a specific template within self.template.
+ # "showTemplate" determines if the current user may generate documents
+ # based on this pod field. More precisely, "showTemplate", if specified,
+ # must be a method that will be called with the current template as
+ # single arg (one among self.template) and that must return the list or
+ # tuple of formats that the current user may use as output formats for
+ # generating a document. If the current user is not allowed at all to
+ # generate documents based on the current template, "showTemplate" must
+ # return an empty tuple/list. If "showTemplate" is not specified, the
+ # user will be able to generate documents based on the current template,
+ # in any format from self.formats (see below).
+ # "showTemplate" comes in addition to self.show. self.show dictates the
+ # visibility of the whole field (ie, all templates from self.template)
+ # while "showTemplate" dictates the visiblity of a specific template
+ # within self.template.
self.showTemplate = showTemplate
+ # "freezeTemplate" determines if the current user may freeze documents
+ # normally generated dynamically from this pod field. More precisely,
+ # "freezeTemplate", if specified, must be a method that will be called
+ # with the current template as single arg and must return the (possibly
+ # empty) list or tuple of formats the current user may freeze. The
+ # "freezing-related actions" that are granted by "freezeTemplate" are
+ # the following. When no document is frozen yet for a given
+ # template/format, the user may:
+ # - freeze the document: pod will be called to produce a document from
+ # the current database content and will store it in the database.
+ # Subsequent user requests for this pod field will return the frozen
+ # doc instead of generating on-the-fly documents;
+ # - upload a document: the user will be able to upload a document that
+ # will be stored in the database. Subsequent user requests for this
+ # pod field will return this doc instead of generating on-the-fly
+ # documents.
+ # When a document is already frozen or uploaded for a given
+ # template/format, the user may:
+ # - unfreeze the document: the frozen or uploaded document will be
+ # deleted from the database and subsequent user requests for the pod
+ # field will again generate on-the-fly documents;
+ # - re-freeze the document: the frozen or uploaded document will be
+ # deleted, a new document will be generated from the current database
+ # content and will be frozen as a replacement to the deleted one;
+ # - upload a document: the frozen or uploaded document will be replaced
+ # by a new document uploaded by the current user.
+ self.freezeTemplate = freezeTemplate
# The context is a dict containing a specific pod context, or a method
# that returns such a dict.
self.context = context
@@ -118,12 +201,11 @@ class Pod(Field):
# field is determined by freezing.
self.validable = False
- def getOutputFormats(self, obj):
- '''Returns self.formats, excepted if there is a frozen document: in
- this case, only the format of the frozen doc is returned.'''
- if not obj.user.has_role('Manager'): return self.formats
- # A manager can have all formats
- return self.allFormats
+ def getAllFormats(self, template):
+ '''Gets all the outputy formats that are available for a given
+ p_template.'''
+ ext = os.path.splitext(template)[1]
+ return self.allFormats[ext]
def getTemplateName(self, obj, fileName):
'''Gets the name of a template given its p_fileName.'''
@@ -149,14 +231,25 @@ class Pod(Field):
def getVisibleTemplates(self, obj):
'''Returns, among self.template, the template(s) that can be shown.'''
- if not self.showTemplate: return self.template # Show them all.
+ isManager = obj.user.has_role('Manager')
+ if not self.showTemplate:
+ # Show them all in any format.
+ res = []
+ for template in self.template:
+ res.append(Object(template=template,
+ formats=self.getAllFormats(template),
+ freezeFormats=self.getFreezeFormats(obj, template)))
res = []
for template in self.template:
- if self.showTemplate(obj, template):
- res.append(template)
+ formats = isManager and self.getAllFormats(template) or \
+ self.showTemplate(obj, template)
+ if formats:
+ res.append(Object(template=template, formats=formats,
+ freezeFormats=self.getFreezeFormats(obj, template)))
return res
- def getValue(self, obj, template=None, format=None, result=None):
+ def getValue(self, obj, template=None, format=None, result=None,
+ noSecurity=False):
'''For a pod field, getting its value means computing a pod document or
returning a frozen one. A pod field differs from other field types
because there can be several ways to produce the field value (ie:
@@ -172,12 +265,11 @@ class Pod(Field):
template = template or rq.get('template') or self.template[0]
format = format or rq.get('podFormat') or 'odt'
# Security check.
- if not self.showTemplate(obj, template):
- raise Exception(self.UNAVAILABLE_TEMPLATE)
+ if not noSecurity and not self.showTemplate(obj, template):
+ raise Exception(self.UNAUTHORIZED)
# Return the frozen document if frozen.
frozen = self.isFrozen(obj, template, format)
if frozen:
- print 'RETURN FROZEN'
fileName = self.getDownloadName(obj, template, format, False)
return FileInfo(frozen, inDb=False, uploadName=fileName)
# We must call pod to compute a pod document from "template".
@@ -254,12 +346,12 @@ class Pod(Field):
# Get a FileInfo instance to manipulate the file on the filesystem.
return FileInfo(result, inDb=False, uploadName=fileName)
- def getFreezeName(self, template=None, format='pdf'):
+ def getFreezeName(self, template=None, format='pdf', sep='.'):
'''Gets the name on disk on the frozen document corresponding to this
pod field, p_template and p_format.'''
template = template or self.template[0]
templateName = os.path.splitext(template)[0].replace(os.sep, '_')
- return '%s_%s.%s' % (self.name, templateName, format)
+ return '%s_%s%s%s' % (self.name, templateName, sep, format)
def isFrozen(self, obj, template=None, format='pdf'):
'''Is there a frozen document for thid pod field, on p_obj, for
@@ -271,9 +363,18 @@ class Pod(Field):
res = os.path.join(dbFolder, folder, fileName)
if os.path.exists(res): return res
- def freeze(self, obj, template=None, format='pdf'):
+ def freeze(self, obj, template=None, format='pdf', noSecurity=True,
+ freezeOdtOnError=True):
'''Freezes, on p_obj, a document for this pod field, for p_template in
- p_format.'''
+ p_format. If p_noSecurity is True, the security check, based on
+ self.freezeTemplate, is bypassed. if freezeOdtOnError is True and
+ format is not "odt", if the freezing fails we try to freeze the odt
+ version, which is more robust because it does not require calling
+ LibreOffice.'''
+ # Security check.
+ if not noSecurity and \
+ (format not in self.getFreezeFormats(obj, template)):
+ raise Exception(self.UNAUTHORIZED)
# Compute the absolute path where to store the frozen document in the
# database.
dbFolder, folder = obj.o.getFsFolder(create=True)
@@ -282,12 +383,12 @@ class Pod(Field):
if os.path.exists(result):
obj.log('Freeze: overwriting %s...' % result)
# Generate the document.
- doc = self.getValue(obj, template=template, format=format,
- result=result)
+ doc = self.getValue(obj, template=template, format=format,result=result)
if isinstance(doc, basestring):
# An error occurred, the document was not generated.
obj.log(self.FREEZE_ERROR % (format, self.name, doc), type='error')
- if format == 'odt': raise Exception(self.FREEZE_FATAL_ERROR)
+ if not freezeOdtOnError or (format == 'odt'):
+ raise Exception(self.FREEZE_FATAL_ERROR)
obj.log('Trying to freeze the ODT version...')
# Try to freeze the ODT version of the document, which does not
# require to call LibreOffice: the risk of error is smaller.
@@ -303,12 +404,35 @@ class Pod(Field):
raise Exception(self.FREEZE_FATAL_ERROR)
return doc
- def unfreeze(self, obj, template=None, format='pdf'):
+ def unfreeze(self, obj, template=None, format='pdf', noSecurity=True):
'''Unfreezes, on p_obj, the document for this pod field, for p_template
in p_format.'''
+ # Security check.
+ if not noSecurity and \
+ (format not in self.getFreezeFormats(obj, template)):
+ raise Exception(self.UNAUTHORIZED)
# Compute the absolute path to the frozen doc.
dbFolder, folder = obj.o.getFsFolder()
fileName = self.getFreezeName(template, format)
frozenName = os.path.join(dbFolder, folder, fileName)
if os.path.exists(frozenName): os.remove(frozenName)
+
+ def getFreezeFormats(self, obj, template=None):
+ '''What are the formats into which the current user may freeze
+ p_template?'''
+ # Manager can always perform freeze actions.
+ template = template or self.template[0]
+ isManager = obj.user.has_role('Manager')
+ if isManager: return self.getAllFormats(template)
+ # Others users can perform freeze actions depending on
+ # self.freezeTemplate.
+ if not self.freezeTemplate: return ()
+ return self.freezeTemplate(obj, template)
+
+ def getIconTitle(self, obj, format, frozen):
+ '''Get the title of the format icon.'''
+ res = obj.translate(format)
+ if frozen:
+ res += ' (%s)' % obj.translate('frozen')
+ return res
# ------------------------------------------------------------------------------
diff --git a/fields/ref.py b/fields/ref.py
index 867f69f..7b72853 100644
--- a/fields/ref.py
+++ b/fields/ref.py
@@ -214,7 +214,7 @@ class Ref(Field):
# PX that displays referred objects as menus.
pxViewMenus = Px('''
-
@@ -234,7 +234,7 @@ class Ref(Field):
+
:ztied.title
diff --git a/gen/mixins/ToolMixin.py b/gen/mixins/ToolMixin.py
index f16daf5..e8c2134 100644
--- a/gen/mixins/ToolMixin.py
+++ b/gen/mixins/ToolMixin.py
@@ -19,8 +19,7 @@ except ImportError:
_noroles = []
# Errors -----------------------------------------------------------------------
-jsMessages = ('no_elem_selected', 'delete_confirm', 'unlink_confirm',
- 'unlock_confirm', 'warn_leave_form')
+jsMessages = ('no_elem_selected', 'action_confirm', 'warn_leave_form')
# ------------------------------------------------------------------------------
class ToolMixin(BaseMixin):
@@ -108,21 +107,37 @@ class ToolMixin(BaseMixin):
if not bg: return url
return 'background-image: url(%s)' % url
- def generateDocument(self):
- '''Generates the document from field-related info. UID of object that
- is the template target is given in the request.'''
+ def doPod(self):
+ '''Performs an action linked to a pod field: generate, freeze,
+ unfreeze... a document from a pod field.'''
rq = self.REQUEST
- # Get the object on which a document must be generated.
+ # Get the object that is the target of this action.
obj = self.getObject(rq.get('objectUid'), appy=True)
fieldName = rq.get('fieldName')
- # Get the document by accessing the value of the pod field.
- res = getattr(obj, fieldName)
- if isinstance(res, basestring):
- # An error has occurred, and p_res contains the error message
- obj.say(res)
+ # What is the action to perform?
+ action = rq.get('action', 'generate')
+ if action == 'generate':
+ # Generate a (or get a frozen) document by accessing the value of
+ # the pod field.
+ res = getattr(obj, fieldName)
+ if isinstance(res, basestring):
+ # An error has occurred, and p_res contains the error message
+ obj.say(res)
+ return self.goto(rq.get('HTTP_REFERER'))
+ # res contains a FileInfo instance.
+ res.writeResponse(rq.RESPONSE)
+ elif action == 'freeze':
+ # (Re-)freeze a document in the database.
+ res = obj.freeze(fieldName, rq.get('template'), rq.get('podFormat'),
+ noSecurity=False, freezeOdtOnError=False)
+ obj.say(obj.translate('action_done'))
+ return self.goto(rq.get('HTTP_REFERER'))
+ elif action == 'unfreeze':
+ # Unfreeze a document in the database.
+ obj.unfreeze(fieldName, rq.get('template'), rq.get('podFormat'),
+ noSecurity=False)
+ obj.say(obj.translate('action_done'))
return self.goto(rq.get('HTTP_REFERER'))
- # res contains a FileInfo instance.
- res.writeResponse(rq.RESPONSE)
def getAppName(self):
'''Returns the name of the application.'''
diff --git a/gen/mixins/__init__.py b/gen/mixins/__init__.py
index 2cc3215..f216b22 100644
--- a/gen/mixins/__init__.py
+++ b/gen/mixins/__init__.py
@@ -156,7 +156,7 @@ class BaseMixin:
urlBack = self.getTool().getSiteUrl()
else:
urlBack = self.getUrl(rq['HTTP_REFERER'])
- self.say(self.translate('delete_done'))
+ self.say(self.translate('action_done'))
self.goto(urlBack)
def onDeleteEvent(self):
@@ -188,7 +188,7 @@ class BaseMixin:
field = sourceObject.getAppyType(rq['fieldName'])
field.unlinkObject(sourceObject, targetObject)
urlBack = self.getUrl(rq['HTTP_REFERER'])
- self.say(self.translate('unlink_done'))
+ self.say(self.translate('action_done'))
self.goto(urlBack)
def onCreate(self):
@@ -327,7 +327,7 @@ class BaseMixin:
obj = tool.getObject(rq['objectUid'])
obj.removeLock(rq['pageName'], force=True)
urlBack = self.getUrl(rq['HTTP_REFERER'])
- self.say(self.translate('unlock_done'))
+ self.say(self.translate('action_done'))
self.goto(urlBack)
def onCreateWithoutForm(self):
diff --git a/gen/tr/Appy.pot b/gen/tr/Appy.pot
index eca9569..ef0372e 100644
--- a/gen/tr/Appy.pot
+++ b/gen/tr/Appy.pot
@@ -203,28 +203,12 @@ msgstr ""
msgid "page_unlock"
msgstr ""
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
+#. Default: "Are you sure?"
+msgid "action_confirm"
msgstr ""
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
-msgstr ""
-
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr ""
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr ""
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr ""
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
+#. Default: "The action has been performed."
+msgid "action_done"
msgstr ""
#. Default: "Go to top"
@@ -287,10 +271,6 @@ msgstr ""
msgid "doc"
msgstr ""
-#. Default: "RTF"
-msgid "rtf"
-msgstr ""
-
#. Default: "ODS"
msgid "ods"
msgstr ""
@@ -299,6 +279,22 @@ msgstr ""
msgid "xls"
msgstr ""
+#. Default: "frozen"
+msgid "frozen"
+msgstr ""
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr ""
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr ""
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr ""
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr ""
diff --git a/gen/tr/ar.po b/gen/tr/ar.po
index 7d37d11..3fbd989 100644
--- a/gen/tr/ar.po
+++ b/gen/tr/ar.po
@@ -203,28 +203,12 @@ msgstr ""
msgid "page_unlock"
msgstr ""
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
+#. Default: "Are you sure?"
+msgid "action_confirm"
msgstr ""
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
-msgstr ""
-
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr ""
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr ""
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr ""
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
+#. Default: "The action has been performed."
+msgid "action_done"
msgstr ""
#. Default: "Go to top"
@@ -287,10 +271,6 @@ msgstr ""
msgid "doc"
msgstr ""
-#. Default: "RTF"
-msgid "rtf"
-msgstr ""
-
#. Default: "ODS"
msgid "ods"
msgstr ""
@@ -299,6 +279,22 @@ msgstr ""
msgid "xls"
msgstr ""
+#. Default: "frozen"
+msgid "frozen"
+msgstr ""
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr ""
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr ""
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr ""
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr ""
diff --git a/gen/tr/de.po b/gen/tr/de.po
index 5b66b47..d4f5aa3 100644
--- a/gen/tr/de.po
+++ b/gen/tr/de.po
@@ -203,28 +203,12 @@ msgstr ""
msgid "page_unlock"
msgstr ""
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
-msgstr "Wollen Sie dieses Element wirklich entfernen?"
-
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
+#. Default: "Are you sure?"
+msgid "action_confirm"
msgstr ""
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr ""
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr "Das Element wurde entfernt."
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr ""
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
+#. Default: "The action has been performed."
+msgid "action_done"
msgstr ""
#. Default: "Go to top"
@@ -287,10 +271,6 @@ msgstr "PDF"
msgid "doc"
msgstr "DOC (Microsoft Word)"
-#. Default: "RTF"
-msgid "rtf"
-msgstr "RTF (Rich Text)"
-
#. Default: "ODS"
msgid "ods"
msgstr ""
@@ -299,6 +279,22 @@ msgstr ""
msgid "xls"
msgstr ""
+#. Default: "frozen"
+msgid "frozen"
+msgstr ""
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr ""
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr ""
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr ""
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr ""
diff --git a/gen/tr/en.po b/gen/tr/en.po
index 5b4efeb..23d8f47 100644
--- a/gen/tr/en.po
+++ b/gen/tr/en.po
@@ -204,29 +204,13 @@ msgstr "Unlink"
msgid "page_unlock"
msgstr "Unlock"
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
-msgstr "Are you sure you want to delete this element?"
+#. Default: "Are you sure?"
+msgid "action_confirm"
+msgstr ""
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
-msgstr "Are you sure you want to unlink this element?"
-
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr "Are you sure you want to unlock this page?"
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr "The element has been deleted."
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr "The element has been unlinked."
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
-msgstr "The page has been unlocked."
+#. Default: "The action has been performed."
+msgid "action_done"
+msgstr ""
#. Default: "Go to top"
msgid "goto_first"
@@ -288,10 +272,6 @@ msgstr "PDF"
msgid "doc"
msgstr "DOC"
-#. Default: "RTF"
-msgid "rtf"
-msgstr "RTF"
-
#. Default: "ODS"
msgid "ods"
msgstr "ODS"
@@ -300,6 +280,22 @@ msgstr "ODS"
msgid "xls"
msgstr "XLS"
+#. Default: "frozen"
+msgid "frozen"
+msgstr "frozen"
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr "(Re-)freeze"
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr "Unfreeze"
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr "Upload a new file"
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr "Welcome to this Appy-powered site."
diff --git a/gen/tr/es.po b/gen/tr/es.po
index 77ec0f5..ef0f8db 100644
--- a/gen/tr/es.po
+++ b/gen/tr/es.po
@@ -203,28 +203,12 @@ msgstr ""
msgid "page_unlock"
msgstr ""
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
-msgstr "¿Está seguro de querer suprimir ese elemento?"
+#. Default: "Are you sure?"
+msgid "action_confirm"
+msgstr "¿Está seguro?"
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
-msgstr ""
-
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr ""
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr "El elemento ha sido suprimido."
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr ""
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
+#. Default: "The action has been performed."
+msgid "action_done"
msgstr ""
#. Default: "Go to top"
@@ -287,10 +271,6 @@ msgstr "PDF"
msgid "doc"
msgstr "DOC (Microsoft Word)"
-#. Default: "RTF"
-msgid "rtf"
-msgstr "RTF (Rich Text)"
-
#. Default: "ODS"
msgid "ods"
msgstr ""
@@ -299,6 +279,22 @@ msgstr ""
msgid "xls"
msgstr ""
+#. Default: "frozen"
+msgid "frozen"
+msgstr ""
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr ""
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr ""
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr ""
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr ""
diff --git a/gen/tr/fr.po b/gen/tr/fr.po
index 6d7371b..62aa1c6 100644
--- a/gen/tr/fr.po
+++ b/gen/tr/fr.po
@@ -204,29 +204,13 @@ msgstr "Dissocier"
msgid "page_unlock"
msgstr "Déverrouiller"
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
-msgstr "Êtes-vous sûr de vouloir supprimer cet élément?"
+#. Default: "Are you sure?"
+msgid "action_confirm"
+msgstr "Êtes-vous sûr?"
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
-msgstr "Êtes-vous sûr de vouloir dissocier cet élément?"
-
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr "Êtes-vous sûr de vouloir déverrouiller cette page?"
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr "L'élément a été supprimé."
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr "L'élément a été dissocié."
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
-msgstr "La page a été déverrouillée."
+#. Default: "The action has been performed."
+msgid "action_done"
+msgstr "L'action a été réalisée."
#. Default: "Go to top"
msgid "goto_first"
@@ -288,10 +272,6 @@ msgstr "PDF"
msgid "doc"
msgstr "DOC (Microsoft Word)"
-#. Default: "RTF"
-msgid "rtf"
-msgstr "RTF (Rich Text)"
-
#. Default: "ODS"
msgid "ods"
msgstr "ODS (LibreOffice Calc)"
@@ -300,6 +280,22 @@ msgstr "ODS (LibreOffice Calc)"
msgid "xls"
msgstr "XLS (Microsoft Excel)"
+#. Default: "frozen"
+msgid "frozen"
+msgstr "gelé"
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr "(Re-)geler"
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr "Dégeler"
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr "Écraser par..."
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr "Bienvenue sur ce site fabriqué avec Appy"
diff --git a/gen/tr/it.po b/gen/tr/it.po
index ae52f23..1fe6d1d 100644
--- a/gen/tr/it.po
+++ b/gen/tr/it.po
@@ -203,28 +203,12 @@ msgstr ""
msgid "page_unlock"
msgstr ""
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
-msgstr "È sicuro di voler eliminare questo elemento?"
+#. Default: "Are you sure?"
+msgid "action_confirm"
+msgstr "È sicuro?"
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
-msgstr ""
-
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr ""
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr "L'elemento è stato cancellato."
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr ""
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
+#. Default: "The action has been performed."
+msgid "action_done"
msgstr ""
#. Default: "Go to top"
@@ -287,10 +271,6 @@ msgstr "PDF"
msgid "doc"
msgstr "DOC (Microsoft Word)"
-#. Default: "RTF"
-msgid "rtf"
-msgstr "RTF (Rich Text)"
-
#. Default: "ODS"
msgid "ods"
msgstr ""
@@ -299,6 +279,22 @@ msgstr ""
msgid "xls"
msgstr ""
+#. Default: "frozen"
+msgid "frozen"
+msgstr ""
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr ""
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr ""
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr ""
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr ""
diff --git a/gen/tr/nl.po b/gen/tr/nl.po
index 96c04dc..504339d 100644
--- a/gen/tr/nl.po
+++ b/gen/tr/nl.po
@@ -203,28 +203,12 @@ msgstr ""
msgid "page_unlock"
msgstr ""
-#. Default: "Are you sure you want to delete this element?"
-msgid "delete_confirm"
-msgstr "Wil u dit element werkelijk verwijderen?"
-
-#. Default: "Are you sure you want to unlink this element?"
-msgid "unlink_confirm"
+#. Default: "Are you sure?"
+msgid "action_confirm"
msgstr ""
-#. Default: "Are you sure you want to unlock this page?"
-msgid "unlock_confirm"
-msgstr ""
-
-#. Default: "The element has been deleted."
-msgid "delete_done"
-msgstr "Het element werd verwijderd."
-
-#. Default: "The element has been unlinked."
-msgid "unlink_done"
-msgstr ""
-
-#. Default: "The page has been unlocked."
-msgid "unlock_done"
+#. Default: "The action has been performed."
+msgid "action_done"
msgstr ""
#. Default: "Go to top"
@@ -287,10 +271,6 @@ msgstr "PDF"
msgid "doc"
msgstr "DOC (Microsoft Word)"
-#. Default: "RTF"
-msgid "rtf"
-msgstr "RTF (Rich Text)"
-
#. Default: "ODS"
msgid "ods"
msgstr ""
@@ -299,6 +279,22 @@ msgstr ""
msgid "xls"
msgstr ""
+#. Default: "frozen"
+msgid "frozen"
+msgstr ""
+
+#. Default: "(Re-)freeze"
+msgid "freezeField"
+msgstr ""
+
+#. Default: "Unfreeze"
+msgid "unfreezeField"
+msgstr ""
+
+#. Default: "Upload a new file"
+msgid "uploadField"
+msgstr ""
+
#. Default: "Welcome to this Appy-powered site."
msgid "front_page_text"
msgstr ""
diff --git a/gen/ui/appy.css b/gen/ui/appy.css
index 2947e18..b0f8997 100644
--- a/gen/ui/appy.css
+++ b/gen/ui/appy.css
@@ -102,9 +102,8 @@ td.search { padding-top: 8px }
width: 350px; z-index : 100; background: white; padding: 8px;
border: 1px solid grey }
.dropdown { display:none; position: absolute; border: 1px solid #cccccc;
- background-color: white; padding-top: 4px }
-.dropdownMenu { cursor: pointer; padding-right: 4px }
-.dropdown a { padding: 0 0.5em }
+ background-color: white; padding: 3px 4px 0 }
+.dropdownMenu { cursor: pointer; padding-right: 4px; font-size: 93% }
.dropdown a:hover { text-decoration: underline }
.list { margin-bottom: 3px }
.list td, .list th { border: 1px solid grey;
@@ -156,5 +155,5 @@ td.search { padding-top: 8px }
.homeTable th { padding-top: 5px; font-size: 105% }
.first { margin-top: 0px }
.error { margin: 5px }
-.podName { font-size: 90%; padding-left: 3px }
+.podName { font-size: 90% }
.podTable { margin-left: 15px }
diff --git a/gen/ui/appy.js b/gen/ui/appy.js
index 2972951..62bd6a7 100644
--- a/gen/ui/appy.js
+++ b/gen/ui/appy.js
@@ -446,14 +446,14 @@ function triggerTransition(formId, transitionId, msg) {
function onDeleteObject(objectUid) {
f = document.getElementById('deleteForm');
f.objectUid.value = objectUid;
- askConfirm('form', 'deleteForm', delete_confirm);
+ askConfirm('form', 'deleteForm', action_confirm);
}
function onDeleteEvent(objectUid, eventTime) {
f = document.getElementById('deleteEventForm');
f.objectUid.value = objectUid;
f.eventTime.value = eventTime;
- askConfirm('form', 'deleteEventForm', delete_confirm);
+ askConfirm('form', 'deleteEventForm', action_confirm);
}
function onUnlinkObject(sourceUid, fieldName, targetUid) {
@@ -461,14 +461,14 @@ function onUnlinkObject(sourceUid, fieldName, targetUid) {
f.sourceUid.value = sourceUid;
f.fieldName.value = fieldName;
f.targetUid.value = targetUid;
- askConfirm('form', 'unlinkForm', unlink_confirm);
+ askConfirm('form', 'unlinkForm', action_confirm);
}
function onUnlockPage(objectUid, pageName) {
f = document.getElementById('unlockForm');
f.objectUid.value = objectUid;
f.pageName.value = pageName;
- askConfirm('form', 'unlockForm', unlock_confirm);
+ askConfirm('form', 'unlockForm', action_confirm);
}
function createCookie(name, value, days) {
@@ -521,17 +521,38 @@ function toggleCookie(cookieId) {
}
// Function that allows to generate a document from a pod template.
-function generatePodDocument(uid, fieldName, template, podFormat, queryData,
- customParams) {
- var theForm = document.getElementById("podTemplateForm");
- theForm.objectUid.value = uid;
- theForm.fieldName.value = fieldName;
- theForm.template.value = template;
- theForm.podFormat.value = podFormat;
- theForm.queryData.value = queryData;
- if (customParams) { theForm.customParams.value = customParams; }
- else { theForm.customParams.value = ''; }
- theForm.submit();
+function generatePod(uid,fieldName,template,podFormat,queryData,customParams) {
+ var f = document.getElementById('podForm');
+ f.objectUid.value = uid;
+ f.fieldName.value = fieldName;
+ f.template.value = template;
+ f.podFormat.value = podFormat;
+ f.queryData.value = queryData;
+ if (customParams) { f.customParams.value = customParams; }
+ else { f.customParams.value = ''; }
+ f.action.value = 'generate';
+ f.submit();
+}
+
+// Function that allows to (un-)freeze a document from a pod template.
+function freezePod(uid, fieldName, template, podFormat, action) {
+ var f = document.getElementById('podForm');
+ f.objectUid.value = uid;
+ f.fieldName.value = fieldName;
+ f.template.value = template;
+ f.podFormat.value = podFormat;
+ f.action.value = action;
+ askConfirm('form', 'podForm', action_confirm);
+}
+
+// Function that allows to upload a file for freezing it in a od field.
+function uploadPod(uid, fieldName, template, podFormat) {
+ var f = document.getElementById('uploadForm');
+ f.objectUid.value = uid;
+ f.fieldName.value = fieldName;
+ f.template.value = template;
+ f.podFormat.value = podFormat;
+ openPopup('uploadPopup');
}
function protectAppyForm() {
diff --git a/gen/ui/doc.png b/gen/ui/doc.png
index 54839ce..bab799c 100644
Binary files a/gen/ui/doc.png and b/gen/ui/doc.png differ
diff --git a/gen/ui/docFrozen.png b/gen/ui/docFrozen.png
new file mode 100644
index 0000000..52d9d80
Binary files /dev/null and b/gen/ui/docFrozen.png differ
diff --git a/gen/ui/freeze.png b/gen/ui/freeze.png
new file mode 100644
index 0000000..5ea8c72
Binary files /dev/null and b/gen/ui/freeze.png differ
diff --git a/gen/ui/frozen.png b/gen/ui/frozen.png
new file mode 100644
index 0000000..cf3d42e
Binary files /dev/null and b/gen/ui/frozen.png differ
diff --git a/gen/ui/ods.png b/gen/ui/ods.png
index 04e71a5..e7e1582 100644
Binary files a/gen/ui/ods.png and b/gen/ui/ods.png differ
diff --git a/gen/ui/odsFrozen.png b/gen/ui/odsFrozen.png
new file mode 100644
index 0000000..417cb4b
Binary files /dev/null and b/gen/ui/odsFrozen.png differ
diff --git a/gen/ui/odt.png b/gen/ui/odt.png
index 142174a..0576a08 100644
Binary files a/gen/ui/odt.png and b/gen/ui/odt.png differ
diff --git a/gen/ui/odtFrozen.png b/gen/ui/odtFrozen.png
new file mode 100644
index 0000000..1dd2b12
Binary files /dev/null and b/gen/ui/odtFrozen.png differ
diff --git a/gen/ui/pdf.png b/gen/ui/pdf.png
index 304265c..2933b3b 100644
Binary files a/gen/ui/pdf.png and b/gen/ui/pdf.png differ
diff --git a/gen/ui/pdfFrozen.png b/gen/ui/pdfFrozen.png
new file mode 100644
index 0000000..ae6b5d2
Binary files /dev/null and b/gen/ui/pdfFrozen.png differ
diff --git a/gen/ui/rtf.png b/gen/ui/rtf.png
deleted file mode 100644
index beb9bf2..0000000
Binary files a/gen/ui/rtf.png and /dev/null differ
diff --git a/gen/ui/unfreeze.png b/gen/ui/unfreeze.png
new file mode 100644
index 0000000..c44095e
Binary files /dev/null and b/gen/ui/unfreeze.png differ
diff --git a/gen/ui/upload.png b/gen/ui/upload.png
new file mode 100644
index 0000000..79da9a7
Binary files /dev/null and b/gen/ui/upload.png differ
diff --git a/gen/ui/xls.png b/gen/ui/xls.png
index af1e82d..211788b 100644
Binary files a/gen/ui/xls.png and b/gen/ui/xls.png differ
diff --git a/gen/ui/xlsFrozen.png b/gen/ui/xlsFrozen.png
new file mode 100644
index 0000000..dc6c05d
Binary files /dev/null and b/gen/ui/xlsFrozen.png differ
diff --git a/gen/wrappers/ToolWrapper.py b/gen/wrappers/ToolWrapper.py
index 845b42c..643584d 100644
--- a/gen/wrappers/ToolWrapper.py
+++ b/gen/wrappers/ToolWrapper.py
@@ -128,15 +128,16 @@ class ToolWrapper(AbstractWrapper):
-
- ''')
pxPageBottom = Px('''
diff --git a/gen/wrappers/__init__.py b/gen/wrappers/__init__.py
index 0e7ac92..bfc8ace 100644
--- a/gen/wrappers/__init__.py
+++ b/gen/wrappers/__init__.py
@@ -123,6 +123,21 @@ class AbstractWrapper(object):
+
+
+
+
+
@@ -791,19 +806,21 @@ class AbstractWrapper(object):
zopeObj.reindex()
return appyObj
- def freeze(self, fieldName, template=None, format='pdf'):
+ def freeze(self, fieldName, template=None, format='pdf', noSecurity=True,
+ freezeOdtOnError=True):
'''This method freezes the content of pod field named p_fieldName, for
the given p_template (several templates can be given in
podField.template), in the given p_format ("pdf" by default).'''
field = self.o.getAppyType(fieldName)
if field.type!= 'Pod': raise Exception('Cannot freeze non-Pod field.')
- return field.freeze(self, template, format)
+ return field.freeze(self, template, format, noSecurity=noSecurity,
+ freezeOdtOnError=freezeOdtOnError)
- def unfreeze(self, fieldName, template=None, format='pdf'):
+ def unfreeze(self, fieldName, template=None, format='pdf', noSecurity=True):
'''This method unfreezes a pod field.'''
field = self.o.getAppyType(fieldName)
if field.type!= 'Pod': raise Exception('Cannot unfreeze non-Pod field.')
- field.unfreeze(self, template, format)
+ field.unfreeze(self, template, format, noSecurity=noSecurity)
def delete(self):
'''Deletes myself.'''
|