From 620bf6fe25ee08e3d0a78e710529c9366c14b45c Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 19 Jun 2015 12:05:14 +0200 Subject: [PATCH 1/6] handle product options correctly --- commerce/interfaces.py | 5 +++-- commerce/order.py | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/commerce/interfaces.py b/commerce/interfaces.py index 8ced6c9..802b071 100644 --- a/commerce/interfaces.py +++ b/commerce/interfaces.py @@ -1,6 +1,6 @@ #-*- coding: UTF-8 -*- # -# Copyright (c) 2012 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 # it under the terms of the GNU General Public License as published by @@ -408,12 +408,13 @@ class IOrderItem(ITrack): shop = Attribute(u'The shop from which the product is ordered.') order = Attribute(u'The order this order item belongs to.') unitPrice = Attribute(u'The basic unit price for one of the product ' - u'items ordered.') + u'ites ordered.') fullPrice = Attribute(u'The full price for the quantity ordered.') quantityShipped = Attribute(u'The total quantity that has been shipped ' u'already.') shippingInfo = Attribute(u'A list of mappings, with fields like: ' u'shippingId, shippingDate, quantity, packageId') + options = Attribute(u'Product options associated with this order item.') def remove(): """ Remove the order item from the order or cart. diff --git a/commerce/order.py b/commerce/order.py index 66732e7..1c66618 100644 --- a/commerce/order.py +++ b/commerce/order.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2009 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 # it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ """ Order and order item classes. - -$Id$ """ from zope.app.intid.interfaces import IIntIds @@ -118,7 +116,10 @@ class OrderItems(object): def add(self, product, party, shop, order='???', run=0, **kw): kw['shop'] = self.getUid(shop) + options = kw.get('options', []) existing = self.getCart(party, order, shop, run, product=product) + existing = [item for item in existing + if (item.data.get('options') or []) == options] if existing: track = existing[-1] track.modify(track.quantity + kw.get('quantity', 1)) From 81d17e8966cab33d0e3eadebf54676633ce3c409 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 20 Jun 2015 09:29:42 +0200 Subject: [PATCH 2/6] better backword compatibility: ignore product options if not present --- commerce/order.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/commerce/order.py b/commerce/order.py index 1c66618..5e8b147 100644 --- a/commerce/order.py +++ b/commerce/order.py @@ -116,10 +116,11 @@ class OrderItems(object): def add(self, product, party, shop, order='???', run=0, **kw): kw['shop'] = self.getUid(shop) - options = kw.get('options', []) existing = self.getCart(party, order, shop, run, product=product) - existing = [item for item in existing - if (item.data.get('options') or []) == options] + options = kw.get('options') + if options is not None: + existing = [item for item in existing + if (item.data.get('options') or []) == options] if existing: track = existing[-1] track.modify(track.quantity + kw.get('quantity', 1)) From c5087b764bea48e0b59d098704d4077340e7d132 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 16 Jul 2015 15:55:07 +0200 Subject: [PATCH 3/6] add some (still commented-out) code as marker for future extension, e.g. for allowing delegation of running work items --- organize/work.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/organize/work.py b/organize/work.py index 63f8979..921ee7f 100644 --- a/organize/work.py +++ b/organize/work.py @@ -52,7 +52,7 @@ def workItemStates(): 'move', 'cancel', 'modify'), color='yellow'), State('running', 'running', - ('work', 'finish', 'move', 'cancel', 'modify'), + ('work', 'finish', 'move', 'cancel', 'modify'), # 'delegate', # ? color='orange'), State('done', 'done', ('plan', 'accept', 'start', 'work', 'finish', 'delegate', @@ -279,6 +279,9 @@ class WorkItem(Stateful, Track): if self.state in ('planned', 'accepted', 'delegated', 'moved', 'done'): self.state = self.state + '_x' self.reindex('state') + #elif self.state == 'running': + # self.doAction('work', userName, + # end=(kw.get('end') or getTimeStamp())) xkw = dict(kw) xkw.pop('party', None) delegated = self.createNew('delegate', userName, **xkw) From 6a356c6f9ca7a3b2141b2a2b341f1c8523a0671c Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 16 Jul 2015 20:00:09 +0200 Subject: [PATCH 4/6] allow selection of question groups via party (i.e. person) --- knowledge/survey/questionnaire.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/knowledge/survey/questionnaire.py b/knowledge/survey/questionnaire.py index 45efa0f..bfb78e2 100644 --- a/knowledge/survey/questionnaire.py +++ b/knowledge/survey/questionnaire.py @@ -36,6 +36,9 @@ class Questionnaire(object): self.responses = [] self.defaultAnswerRange = 5 + def getQuestionGroups(self, party): + return self.questionGroups + class QuestionGroup(object): @@ -95,7 +98,7 @@ class Response(object): def getGroupedResult(self): result = [] - for qugroup in self.questionnaire.questionGroups: + for qugroup in self.questionnaire.getQuestionGroups(self.party): score = scoreMax = 0.0 for qu in qugroup.questions: if qu.questionType not in (None, 'value_selection'): From bf290aea2f5e8655f0f4af3c64ad3816a8b9d85b Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 13 Aug 2015 16:07:14 +0200 Subject: [PATCH 5/6] avoid errors because of missing files during import --- media/piltransform.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/media/piltransform.py b/media/piltransform.py index a040103..df43893 100644 --- a/media/piltransform.py +++ b/media/piltransform.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 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 # it under the terms of the GNU General Public License as published by @@ -20,8 +20,6 @@ Views for displaying media assets. Authors: Johann Schimpf, Erich Seifert. - -$Id$ """ from logging import getLogger @@ -35,6 +33,8 @@ from zope.interface import implements from cybertools.media.interfaces import IMediaAsset, IFileTransform from cybertools.storage.filesystem import FileSystemStorage +logger = getLogger('cybertools.media.piltransform.PILTransform') + def mimetypeToPIL(mimetype): return mimetype.split("/",1)[-1] @@ -51,8 +51,7 @@ class PILTransform(object): try: self.im = Image.open(path) except IOError, e: - from logging import getLogger - getLogger('cybertools.media.piltransform.PILTransform').warn(e) + logger.warn(e) self.im = None def rotate(self, angle, resize): @@ -101,10 +100,17 @@ class PILTransform(object): ratio = float(ow) / float(oh) height = int(round(float(width) / ratio)) dims = (width, height) - self.im.thumbnail(dims, Image.ANTIALIAS) + try: + self.im.thumbnail(dims, Image.ANTIALIAS) + except IOError, e: + logger.warn(e) + def save(self, path, mimetype): if self.im is None: return format = mimetypeToPIL(mimetype) - self.im.save(path) + try: + self.im.save(path) + except IOError, e: + logger.warn(e) From c15039b9a7b2ed8bab50afc952a61b33d39a54a8 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 13 Aug 2015 16:09:33 +0200 Subject: [PATCH 6/6] avoid zero division error when data are missing --- knowledge/survey/questionnaire.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/knowledge/survey/questionnaire.py b/knowledge/survey/questionnaire.py index bfb78e2..6fb6146 100644 --- a/knowledge/survey/questionnaire.py +++ b/knowledge/survey/questionnaire.py @@ -134,6 +134,8 @@ class Response(object): values = [data.values.get(group) for data in teamData] values = [v for v in values if v is not None] #avg = sum(values) / len(teamData) + if not values: + continue avg = sum(values) / len(values) result.append(dict(group=group, average=avg)) ranks = getRanks([r['average'] for r in result])