Commit 37b1c21f authored by Rafael Monnerat's avatar Rafael Monnerat

Planning Box was completly refactored. Please update your business

templates in order to make it works.



git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@18275 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 7473d9ef
......@@ -7,10 +7,10 @@
# Jonathan Loriette <john@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
......@@ -37,6 +37,8 @@
# this method should return a list of all the objects' urls that does not
# fit the constraints.
# Class monitoring access security control
from Products.PythonScripts.Utility import allow_class
from Globals import InitializeClass
......@@ -248,6 +250,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
if final_block['activity_origin'].name not in warning_activity_list:
warning_activity_list.append(final_block['activity_origin'].name)
block_moved['secondary_axis_start'] = secondary_axis_positions[0]
block_moved['secondary_axis_stop'] = secondary_axis_positions[1]
......@@ -260,6 +263,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
except KeyError:
activity_dict[final_block['activity_origin'].name] = [final_block]
# getting object_dict to update object properties once activities are up to
# date. Activities values will be updated directly on the
object_dict = self.getObjectDict(basic=basic, planning=planning)
......@@ -409,6 +413,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
if block.name == block_name:
return block
def getDestinationGroup(self, basic, planning, block_moved, axis_groups,
group_position, group_length):
"""
......@@ -435,6 +440,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
return group
return None
def getDestinationBounds(self, basic, planning, block_moved, block_object,
planning_coordinates, axis_length,
destination_group=None):
......@@ -739,6 +745,7 @@ class PlanningBoxWidget(Widget.Widget):
default=10,
required=1)
y_axis_position = fields.CheckBoxField('y_axis_position',
title='Force Y axis to the right intead of left',
description='position of Y axis over the planning content.' \
......@@ -754,6 +761,7 @@ class PlanningBoxWidget(Widget.Widget):
default=0,
required=1)
default = fields.TextAreaField('default',
title='Default',
description="Default value of the text in the widget.",
......@@ -761,6 +769,7 @@ class PlanningBoxWidget(Widget.Widget):
width=20, height=3,
required=0)
delimiter = fields.IntegerField('delimiter',
title='min number of delimiters over the secondary axis',
description="min number of delimitations over the sec axis, required",
......@@ -803,6 +812,7 @@ class PlanningBoxWidget(Widget.Widget):
default='',
required=0)
title_line = fields.StringField('title_line',
title="Specific method which fetches the title of each line",
description="Method for inserting title in line",
......@@ -860,6 +870,7 @@ class PlanningBoxWidget(Widget.Widget):
default='',
required=0)
sec_axis_script = fields.StringField('sec_axis_script',
title='Name of script building secondary axis (ex. ' \
'Planning_generateAxis)',
......@@ -1395,6 +1406,7 @@ class BasicStructure:
self.report_groups += [(object_tree_line,object_list,info_dict)]
self.nbr_groups += 1
# reset to original value
self.selection.edit(report = None)
#self.selection.edit(report_list=None) # comment to save report_list status
......@@ -1410,6 +1422,7 @@ class BasicStructure:
unfolded_list.append(report_line.getObject().getRelativeUrl())
self.selection.edit(report_list=unfolded_list)
############## CHECKING CONSTRAINTS ##############
# XXX Constraints checking should be called here
# and results saved in a list (list of url corresponding to objects not
......@@ -1535,6 +1548,7 @@ class BasicStructure:
self.calendar_range = calendar_range
return secondary_axis_occurence
def getSecondaryAxisInfo(self):
"""
secondary_axis_ocurence holds couples of data (begin,end) related to
......@@ -1635,6 +1649,7 @@ class BasicStructure:
# everything is OK, returning 'true' flag
return axis_dict
def getMainAxisInfo(self, report_tree_list):
"""
Getting main axis properties (total pages, current page, groups per page)
......@@ -1698,6 +1713,7 @@ class BasicStructure:
return main_axis_dict
def buildGroupStructure(self):
"""
This procedure builds BasicGroup instances corresponding to the
......@@ -1761,6 +1777,7 @@ class BasicStructure:
return 1
class BasicGroup:
"""
A BasicGroup holds informations about an ERP5Object and is stored
......@@ -2088,6 +2105,7 @@ class BasicActivity:
self.error = error
self.property_dict = property_dict # dict containing specific properties
class PlanningStructure:
"""
class aimed to generate the Planning final structure, including :
......@@ -2102,6 +2120,7 @@ class PlanningStructure:
self.content = []
self.content_delimiters = None
def build(self, basic_structure=None, field=None, REQUEST=None):
"""
main procedure for building Planning Structure
......@@ -2229,6 +2248,7 @@ class PlanningStructure:
return axis_group_list
def completeAxis(self):
"""
complete axis informations (and more precisely axis position objects) thanks
......@@ -2385,6 +2405,7 @@ class PlanningStructure:
return 1
return axis_element_already_present
def buildBlocs(self, basic_structure=None, REQUEST=None):
"""
iterate the whole planning structure to get various activities and build
......@@ -2427,6 +2448,7 @@ class PlanningStructure:
# no problem during process, returning 'true' flag
return 1
class Activity:
"""
Class representing a task in the Planning, for example an appointment or
......@@ -2468,11 +2490,13 @@ class Activity:
self.calendar_view = calendar_view
self.property_dict = property_dict
# XXX Still used ?
def get_error_message(self, Error):
# need to update the error message
return 'task %s (%s)not validated' % (self.name, self.title)
def isValidPosition(self, bound_begin, bound_end):
"""
can check if actual activity can fit within the bounds, returns :
......@@ -2667,6 +2691,8 @@ class Activity:
# # return new list
# return returned_list
class Bloc:
"""
structure that will be rendered as a bloc, a task element.
......@@ -2780,6 +2806,7 @@ class Position:
self.relative_end = relative_end
self.relative_range = relative_range
class Axis:
"""
Structure holding informations about a specified axis. Can be X or Y axis.
......@@ -2809,6 +2836,7 @@ class Axis:
# dict containing all class properties with their values
self.render_dict=None
class AxisGroup:
"""
Class representing an item, that can have the following properties :
......@@ -2871,6 +2899,7 @@ class AxisGroup:
self.secondary_axis_range = secondary_axis_range
self.property_dict = property_dict
security = ClassSecurityInfo()
security.declarePublic('setTitle')
......@@ -2902,6 +2931,7 @@ class AxisGroup:
self.tooltip = info_title.info
def addActivity(self, activity=None, axis_element_already_insered=0,
basic_structure=None):
"""
......@@ -2991,6 +3021,7 @@ class AxisGroup:
self.axis_element_list = []
self.axis_element_list.append(new_axis_element)
def addStatActivities(self, basic_activity_list=None, axis_group_number=0,
axis_element_already_present= 0, calendar_view=0,
primary_axis_block=None, property_dict={}):
......@@ -3043,6 +3074,7 @@ class AxisGroup:
activity_number +=1
def updateStatBlocks(self):
"""
called once the blocks have been defined on all activities
......@@ -3101,6 +3133,7 @@ class AxisElement:
self.render_dict=None
self.parent_axis_group = parent_axis_group
class Info:
"""
Class holding all informations to display an info text div inside of a block
......@@ -3122,6 +3155,7 @@ class Info:
# declaring validator instance
PlanningBoxValidatorInstance = PlanningBoxValidator()
class PlanningBox(ZMIField):
meta_type = "PlanningBox"
widget = PlanningBoxWidgetInstance
......
......@@ -664,8 +664,8 @@ class SelectionTool( BaseTool, UniqueObject, SimpleItem ):
return self.checkAll(list_selection_name, uids, REQUEST=REQUEST, query_string=query_string)
# PlanningBox related methods
security.declareProtected(ERP5Permissions.View, 'setZoomLevel')
def setZoomLevel(self, uids=None, REQUEST=None, form_id=None,
security.declareProtected(ERP5Permissions.View, 'setLanePath')
def setLanePath(self, uids=None, REQUEST=None, form_id=None,
query_string=None):
"""
Set graphic zoom level in PlanningBox
......@@ -677,62 +677,24 @@ class SelectionTool( BaseTool, UniqueObject, SimpleItem ):
selection = self.getSelectionFor(selection_name, REQUEST=REQUEST)
if selection is not None:
params = selection.getParams()
zoom_level = request.form.get('zoom_level', None)
if zoom_level is None:
# If zoom_level is not defined try to
lane_path = request.form.get('lane_path', None)
if lane_path is None:
# If lane_path is not defined try to
# use the last one from params
zoom_level = params.get('zoom_level', 1)
# for keep compatibility with the old zoom
zoom_start = request.form.get('zoom_start',0)
if zoom_level <= zoom_start:
zoom_start = max(int(float(zoom_level)),1) - 1
params['zoom_start'] = zoom_start
# XXX URL currently pass string parameter and not int
# This is a dirty fix!
# It should be fixed by cleaning the date zoom level
# in a generic way
zoom_level = int(zoom_level)
zoom_begin = request.form.get('zoom_begin', None)
#zoom_end = request.form.get('zoom_end', None)
zoom_date_start = request.form.get('zoom_date_start', None)
if zoom_date_start is not None:
zoom_begin = zoom_date_start
if zoom_begin is None:
zoom_begin = params.get('zoom_begin', None)
params['zoom_level'] = zoom_level
# Calculating New zoom Dates Range.
validate_method = getattr(self, 'planning_validate_date_list', None)
date_range = validate_method(zoom_begin,zoom_level)
params['from_date'] = params['zoom_begin'] = date_range[0]
params['to_date'] = params['zoom_end'] = date_range[1]
lane_path = params.get('lane_path',1)
bound_start = request.form.get('bound_start', None)
if bound_start is not None:
params['bound_start'] = bound_start
params['lane_path'] = lane_path
params['zoom_variation'] = 0
selection.edit(params=params)
if REQUEST is not None:
return self._redirectToOriginalForm(REQUEST=REQUEST,
form_id=form_id,
query_string=query_string)
security.declareProtected(ERP5Permissions.View, 'setZoom')
def setZoom(self, uids=None, REQUEST=None, form_id=None, query_string=None):
"""
Set graphic zoom in PlanningBox
"""
if uids is None: uids = []
request = REQUEST
selection_name=request.list_selection_name
selection = self.getSelectionFor(selection_name, REQUEST=REQUEST)
if selection is not None:
params = selection.getParams()
zoom_start = request.form.get('zoom_start',0)
params['zoom_start'] = zoom_start
selection.edit(params=params)
if REQUEST is not None:
return self._redirectToOriginalForm(REQUEST=REQUEST, form_id=form_id,
query_string=query_string)
security.declareProtected(ERP5Permissions.View, 'nextZoom')
def nextZoom(self, uids=None, REQUEST=None, form_id=None, query_string=None):
security.declareProtected(ERP5Permissions.View, 'nextLanePage')
def nextLanePage(self, uids=None, REQUEST=None, form_id=None, query_string=None):
"""
Set next graphic zoom start in PlanningBox
"""
......@@ -743,28 +705,15 @@ class SelectionTool( BaseTool, UniqueObject, SimpleItem ):
selection = self.getSelectionFor(selection_name, REQUEST=REQUEST)
if selection is not None:
params = selection.getParams()
zoom_level = params.get('zoom_level', 1)
zoom_variation = + 1
zoom_begin = request.form.get('zoom_begin', None)
# for keep the compatibility
zoom_start = params.get('zoom_start',0)
params['zoom_start'] = int(zoom_start) + 1
if zoom_begin is None:
zoom_begin = params.get('zoom_begin', None)
validate_method = getattr(self, 'planning_validate_date_list', None)
date_range = validate_method(zoom_begin,zoom_level,zoom_variation)
params['zoom_begin'] = params['from_date'] = date_range[0]
params['zoom_end'] = params['to_date'] = date_range[1]
params['bound_variation'] = 1
selection.edit(params=params)
if REQUEST is not None:
return self._redirectToOriginalForm(REQUEST=REQUEST,
form_id=form_id,
query_string=query_string)
security.declareProtected(ERP5Permissions.View, 'previousZoom')
def previousZoom(self, uids=None, REQUEST=None, form_id=None, query_string=None):
security.declareProtected(ERP5Permissions.View, 'previousLanePage')
def previousLanePage(self, uids=None, REQUEST=None, form_id=None, query_string=None):
"""
Set previous graphic zoom in PlanningBox
"""
......@@ -775,20 +724,7 @@ class SelectionTool( BaseTool, UniqueObject, SimpleItem ):
selection = self.getSelectionFor(selection_name, REQUEST=REQUEST)
if selection is not None:
params = selection.getParams()
zoom_level = params.get('zoom_level', 1)
zoom_variation = -1
zoom_begin = request.form.get('zoom_begin', None)
# for keep the compatibility
zoom_start = params.get('zoom_start',0)
params['zoom_start'] = int(zoom_start) - 1
if zoom_begin is None:
zoom_begin = params.get('zoom_begin', None)
validate_method = getattr(self, 'planning_validate_date_list', None)
date_range = validate_method(zoom_begin,zoom_level,zoom_variation)
params['zoom_begin'] = params['from_date'] = date_range[0]
params['zoom_end'] = params['to_date'] = date_range[1]
params['bound_variation'] = -1
selection.edit(params=params)
if REQUEST is not None:
return self._redirectToOriginalForm(REQUEST=REQUEST,
......
......@@ -108,10 +108,10 @@ class TestPlanningBox(ERP5TypeTestCase):
def stepCheckPlanning(self, sequence = None, sequence_list = None, **kw):
planning = sequence.get('planning')
self.assertEquals(planning.calendar_view, 0)
self.assertEquals(planning.vertical_view, 0)
self.assertEquals(len(planning.content), 1)
bloc = planning.content[0]
self.assertEquals(bloc.name , 'Group_1_Activity_1_Block_1')
self.assertEquals(bloc.name , 'group_1_activity_1_block_1')
self.assertEquals(bloc.title , 'Title 0')
for info in bloc.info.values():
self.assertEquals(info.info,'Title 0')
......@@ -129,7 +129,7 @@ class TestPlanningBox(ERP5TypeTestCase):
basic = sequence.get('basic')
self.assertEquals(len(basic.report_groups), 1)
# Note that this test use the use_date_zoom enabled.
sec_axis_info = basic.getSecondaryAxisInfo()
sec_axis_info = basic.getLaneAxisInfo()
date = DateTime()
today = DateTime('%s/%s/%s' % (date.year(),date.month(),date.day()))
self.assertEquals(sec_axis_info['zoom_begin'], today)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment