store sort infos (by task/concept) in user's favorite data

This commit is contained in:
Helmut Merz 2015-03-25 15:09:52 +01:00
parent 9c09222762
commit a3e0cac006
6 changed files with 58 additions and 24 deletions

View file

@ -92,8 +92,8 @@ class DialogAction(Action):
urlParams['fixed_type'] = 'yes' urlParams['fixed_type'] = 'yes'
if self.viewTitle: if self.viewTitle:
urlParams['view_title'] = self.viewTitle urlParams['view_title'] = self.viewTitle
for k, v in self.page.sortInfo.items(): #for k, v in self.page.sortInfo.items():
urlParams['sortinfo_' + k] = v['fparam'] # urlParams['sortinfo_' + k] = v['fparam']
urlParams.update(self.addParams) urlParams.update(self.addParams)
if self.target is not None: if self.target is not None:
url = self.page.getUrlForTarget(self.target) url = self.page.getUrlForTarget(self.target)

View file

@ -67,6 +67,8 @@ from loops.common import adapted, baseObject
from loops.config.base import DummyOptions from loops.config.base import DummyOptions
from loops.i18n.browser import I18NView from loops.i18n.browser import I18NView
from loops.interfaces import IResource, IView, INode, ITypeConcept from loops.interfaces import IResource, IView, INode, ITypeConcept
from loops.organize.personal import favorite
from loops.organize.party import getPersonForUser
from loops.organize.tracking import access from loops.organize.tracking import access
from loops.organize.util import getRolesForPrincipal from loops.organize.util import getRolesForPrincipal
from loops.resource import Resource from loops.resource import Resource
@ -147,6 +149,8 @@ class SortableMixin(object):
dir = 'asc' dir = 'asc'
result[tableName] = dict( result[tableName] = dict(
colName=fn, ascending=(dir=='asc'), fparam=v) colName=fn, ascending=(dir=='asc'), fparam=v)
result = favorite.update(getPersonForUser(
self.context, self.request), self.target, 'sort', result)
return result return result
def isSortableColumn(self, tableName, colName): def isSortableColumn(self, tableName, colName):

View file

@ -75,7 +75,7 @@ So we are now ready to query the favorites.
>>> favs = list(favorites.query(userName=johnCId)) >>> favs = list(favorites.query(userName=johnCId))
>>> favs >>> favs
[<Favorite ['27', 1, '33', '...']: {}>] [<Favorite ['27', 1, '33', '...']: {'type': 'favorite'}>]
>>> list(favAdapted.list(johnC)) >>> list(favAdapted.list(johnC))
['27'] ['27']

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2010 Helmut Merz helmutm@cy55.de # Copyright (c) 2015 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -18,8 +18,6 @@
""" """
Base classes for a notification framework. Base classes for a notification framework.
$Id$
""" """
from zope.component import adapts from zope.component import adapts
@ -39,17 +37,20 @@ class Favorites(object):
def __init__(self, context): def __init__(self, context):
self.context = context self.context = context
def list(self, person, sortKey=None): def list(self, person, sortKey=None, type='favorite'):
for item in self.listTracks(person, sortKey): for item in self.listTracks(person, sortKey, type):
yield item.taskId yield item.taskId
def listTracks(self, person, sortKey=None): def listTracks(self, person, sortKey=None, type='favorite'):
if person is None: if person is None:
return return
personUid = util.getUidForObject(person) personUid = util.getUidForObject(person)
if sortKey is None: if sortKey is None:
sortKey = lambda x: -x.timeStamp sortKey = lambda x: -x.timeStamp
for item in sorted(self.context.query(userName=personUid), key=sortKey): for item in sorted(self.context.query(userName=personUid), key=sortKey):
if type is not None:
if item.type != type:
continue
yield item yield item
def add(self, obj, person, data=None): def add(self, obj, person, data=None):
@ -57,21 +58,23 @@ class Favorites(object):
return False return False
uid = util.getUidForObject(obj) uid = util.getUidForObject(obj)
personUid = util.getUidForObject(person) personUid = util.getUidForObject(person)
if self.context.query(userName=personUid, taskId=uid):
return False
if data is None: if data is None:
data = {} data = {'type': 'favorite'}
for track in self.context.query(userName=personUid, taskId=uid):
if track.type == data['type']: # already present
return False
return self.context.saveUserTrack(uid, 0, personUid, data) return self.context.saveUserTrack(uid, 0, personUid, data)
def remove(self, obj, person): def remove(self, obj, person, type='favorite'):
if None in (obj, person): if None in (obj, person):
return False return False
uid = util.getUidForObject(obj) uid = util.getUidForObject(obj)
personUid = util.getUidForObject(person) personUid = util.getUidForObject(person)
changed = False changed = False
for t in self.context.query(userName=personUid, taskId=uid): for track in self.context.query(userName=personUid, taskId=uid):
changed = True if track.type == type:
self.context.removeTrack(t) changed = True
self.context.removeTrack(track)
return changed return changed
@ -81,3 +84,31 @@ class Favorite(Track):
typeName = 'Favorite' typeName = 'Favorite'
@property
def type(self):
return self.data.get('type') or 'favorite'
def update(person, task, type, data):
if person is not None:
favorites = task.getLoopsRoot().getRecordManager().get('favorites')
if favorites is None:
return data
personUid = util.getUidForObject(person)
taskUid = util.getUidForObject(task)
for fav in favorites.query(userName=personUid, taskId=taskUid):
if fav.data['type'] == 'sort':
fdata = fav.data['sortInfo']
if not data:
data = fdata
else:
if data != fdata:
newData = fav.data
newData['sortInfo'] = data
fav.data = newData
break
else:
if data:
Favorites(favorites).add(task, person,
dict(type='sort', sortInfo=data))
return data

View file

@ -659,11 +659,11 @@ class CreateWorkItem(EditObject, BaseTrackView):
url = self.view.virtualTargetUrl url = self.view.virtualTargetUrl
#url = self.request.URL #url = self.request.URL
# append sortinfo parameters: # append sortinfo parameters:
urlParams = {} #urlParams = {}
for k, v in self.view.sortInfo.items(): #for k, v in self.view.sortInfo.items():
urlParams['sortinfo_' + k] = v['fparam'] # urlParams['sortinfo_' + k] = v['fparam']
if urlParams: #if urlParams:
url = '%s?%s' % (url, urlencode(urlParams)) # url = '%s?%s' % (url, urlencode(urlParams))
self.request.response.redirect(url) self.request.response.redirect(url)
return False return False

View file

@ -74,9 +74,8 @@
<input type="hidden" name="form.action" value="create_workitem" /> <input type="hidden" name="form.action" value="create_workitem" />
<input type="hidden" name="id" <input type="hidden" name="id"
tal:attributes="value request/form/id|nothing" /> tal:attributes="value request/form/id|nothing" />
<p tal:content="view/sortInfo/results/fparam|string:???" /> <!--<input type="hidden" name="sortinfo_results"
<input type="hidden" name="sortinfo_results" tal:attributes="value view/sortInfo/results/fparam|nothing" />-->
tal:attributes="value view/sortInfo/results/fparam|nothing" />
<div class="heading" i18n:translate="">Add Work Item</div> <div class="heading" i18n:translate="">Add Work Item</div>
<div> <div>
<tal:type condition="view/showTypes"> <tal:type condition="view/showTypes">