[gen] Calendar: display weekend days in a special way.

This commit is contained in:
Gaetan Delannay 2012-10-18 20:57:03 +02:00
parent 614ce576af
commit ba148c51aa
6 changed files with 26 additions and 11 deletions

View file

@ -141,6 +141,7 @@ class Calendar(Type):
def getEventsAt(self, obj, date, asDict=True): def getEventsAt(self, obj, date, asDict=True):
'''Returns the list of events that exist at some p_date (=day).''' '''Returns the list of events that exist at some p_date (=day).'''
obj = obj.o # Ensure p_obj is not a wrapper.
if not hasattr(obj, self.name): return if not hasattr(obj, self.name): return
years = getattr(obj, self.name) years = getattr(obj, self.name)
year = date.year() year = date.year()
@ -267,4 +268,18 @@ class Calendar(Type):
return self.createEvent(obj, DateTime(rq['day'])) return self.createEvent(obj, DateTime(rq['day']))
elif action == 'deleteEvent': elif action == 'deleteEvent':
return self.deleteEvent(obj, DateTime(rq['day'])) return self.deleteEvent(obj, DateTime(rq['day']))
def getCellStyle(self, obj, date, today):
'''What CSS classes must apply to the table cell representing p_date
in the calendar?'''
res = []
# We must distinguish between past and future dates.
if date < today:
res.append('even')
else:
res.append('odd')
# Week-end days must have a specific style.
if date.aDay() in ('Sat', 'Sun'):
res.append('cellDashed')
return ' '.join(res)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View file

@ -570,11 +570,8 @@ class ToolClassDescriptor(ClassDescriptor):
groupName = classDescr.klass.__name__ groupName = classDescr.klass.__name__
# Adds a field allowing to show/hide completely any workflow-related # Adds a field allowing to show/hide completely any workflow-related
# information for a given class. # information for a given class.
defaultValue = False
if classDescr.isRoot() or issubclass(classDescr.klass, ModelClass):
defaultValue = True
fieldName = 'showWorkflowFor%s' % className fieldName = 'showWorkflowFor%s' % className
fieldType = gen.Boolean(default=defaultValue, page='userInterface', fieldType = gen.Boolean(default=True, page='userInterface',
group=groupName) group=groupName)
self.addField(fieldName, fieldType) self.addField(fieldName, fieldType)
# Adds the boolean field for showing all states in current state or not. # Adds the boolean field for showing all states in current state or not.

View file

@ -9,7 +9,7 @@ import appy.gen as gen
from appy.gen.utils import * from appy.gen.utils import *
from appy.gen.layout import Table, defaultPageLayouts from appy.gen.layout import Table, defaultPageLayouts
from appy.gen.descriptors import WorkflowDescriptor, ClassDescriptor from appy.gen.descriptors import WorkflowDescriptor, ClassDescriptor
from appy.shared.utils import sequenceTypes from appy.shared.utils import sequenceTypes, normalizeText
from appy.shared.data import rtlLanguages from appy.shared.data import rtlLanguages
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
@ -1215,7 +1215,7 @@ class BaseMixin:
def SortableTitle(self): def SortableTitle(self):
'''Returns the title as must be stored in index "SortableTitle".''' '''Returns the title as must be stored in index "SortableTitle".'''
return self.Title() return normalizeText(self.Title())
def SearchableText(self): def SearchableText(self):
'''This method concatenates the content of every field with '''This method concatenates the content of every field with

View file

@ -97,6 +97,7 @@ img { border: 0; vertical-align: middle}
border-bottom: 2px solid grey; padding: 2px 2px;} border-bottom: 2px solid grey; padding: 2px 2px;}
.grid td { padding-right: 5px; } .grid td { padding-right: 5px; }
.cellGap { padding-right: 0.4em; } .cellGap { padding-right: 0.4em; }
.cellDashed { border: 1px dashed grey !important }
.noStyle { border: 0 !important; padding: 0 !important; margin: 0 !important; } .noStyle { border: 0 !important; padding: 0 !important; margin: 0 !important; }
.noStyle td { border:0 !important; padding:0 !important; margin:0 !important; } .noStyle td { border:0 !important; padding:0 !important; margin:0 !important; }
.translationLabel { background-color: #EAEAEA; border-bottom: 1px dashed grey; .translationLabel { background-color: #EAEAEA; border-bottom: 1px dashed grey;

View file

@ -61,10 +61,10 @@
<tal:cell repeat="date row"> <tal:cell repeat="date row">
<tal:cel define="tooEarly python: startDate and (date &lt; startDate); <tal:cel define="tooEarly python: startDate and (date &lt; startDate);
tooLate python: endDate and not tooEarly and (date &gt; endDate); tooLate python: endDate and not tooEarly and (date &gt; endDate);
inRange python: not tooEarly and not tooLate"> inRange python: not tooEarly and not tooLate;
cssClasses python: contextObj.callField(fieldName, 'getCellStyle', contextObj, date, today)">
<tal:comment replace="nothing">Dump an empty cell if we are out of the supported date range</tal:comment> <tal:comment replace="nothing">Dump an empty cell if we are out of the supported date range</tal:comment>
<td tal:condition="not: inRange" <td tal:condition="not: inRange" tal:attributes="class cssClasses">
tal:attributes="class python: test(date &lt; today, 'even', 'odd');">
</td> </td>
<tal:comment replace="nothing">Dump a normal cell if we are in range</tal:comment> <tal:comment replace="nothing">Dump a normal cell if we are in range</tal:comment>
<tal:td condition="inRange"> <tal:td condition="inRange">
@ -73,7 +73,7 @@
mayCreate python: mayEdit and not events; mayCreate python: mayEdit and not events;
mayDelete python: mayEdit and events;" mayDelete python: mayEdit and events;"
tal:attributes="style python: test(date.isCurrentDay(), 'font-weight:bold', 'font-weight:normal'); tal:attributes="style python: test(date.isCurrentDay(), 'font-weight:bold', 'font-weight:normal');
class python: test(date &lt; today, 'even', 'odd'); class cssClasses;
onmouseover python: test(mayEdit, 'this.getElementsByTagName(\'img\')[0].style.visibility=\'visible\'', ''); onmouseover python: test(mayEdit, 'this.getElementsByTagName(\'img\')[0].style.visibility=\'visible\'', '');
onmouseout python: test(mayEdit, 'this.getElementsByTagName(\'img\')[0].style.visibility=\'hidden\'', '')"> onmouseout python: test(mayEdit, 'this.getElementsByTagName(\'img\')[0].style.visibility=\'hidden\'', '')">
<tal:day define="day date/day; <tal:day define="day date/day;

View file

@ -94,7 +94,9 @@ class AbstractWrapper(object):
'''Gets the attribute named p_name. Lot of cheating here.''' '''Gets the attribute named p_name. Lot of cheating here.'''
if name == 'o': return object.__getattribute__(self, name) if name == 'o': return object.__getattribute__(self, name)
elif name == 'tool': return self.o.getTool().appy() elif name == 'tool': return self.o.getTool().appy()
elif name == 'request': return self.o.REQUEST elif name == 'request':
# The request may not be present, ie if we are at Zope startup.
return getattr(self.o, 'REQUEST', None)
elif name == 'session': return self.o.REQUEST.SESSION elif name == 'session': return self.o.REQUEST.SESSION
elif name == 'typeName': return self.__class__.__bases__[-1].__name__ elif name == 'typeName': return self.__class__.__bases__[-1].__name__
elif name == 'id': return self.o.id elif name == 'id': return self.o.id