Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Contact uid export #59

Merged
merged 7 commits into from
May 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ Changelog
2.0.dev0 (unreleased)
---------------------

- Remove b'' from values in py3 csv export
[agitator]

- Add contact information to export
[jensens, agitator]

- Store contact uid back to order as attr contact_uid.
[jensens, agitator]

Expand Down
34 changes: 33 additions & 1 deletion src/bda/plone/orders/browser/export.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from bda.plone.orders.common import get_orders_soup
from bda.plone.orders.common import get_vendor_uids_for
from bda.plone.orders.common import get_vendors_for
from bda.plone.orders.contacts import get_contacts_soup
from bda.plone.orders.datamanagers.order import OrderData
from bda.plone.orders.interfaces import IBuyable
from decimal import Decimal
Expand All @@ -38,6 +39,7 @@
import plone.api
import uuid
import yafowil.loader # noqa
import six


class DialectExcelWithColons(csv.excel):
Expand Down Expand Up @@ -75,6 +77,10 @@ class DialectExcelWithColons(csv.excel):
"payment_selection.payment",
]
COMPUTED_ORDER_EXPORT_ATTRS = odict()
CONTACT_EXPORT_ATTRS = [
"cid",
]
COMPUTED_CONTACT_EXPORT_ATTRS = odict()
BOOKING_EXPORT_ATTRS = [
"title",
"buyable_comment",
Expand Down Expand Up @@ -191,6 +197,8 @@ def csv(self, request):
orders_soup = get_orders_soup(self.context)
# get bookings soup
bookings_soup = get_bookings_soup(self.context)
# get contacts soup
contacts_soup = get_contacts_soup(self.context)
# fetch user vendor uids
vendor_uids = get_vendor_uids_for()
# base query for time range
Expand All @@ -216,6 +224,8 @@ def csv(self, request):
ex.writerow(
ORDER_EXPORT_ATTRS
+ list(COMPUTED_ORDER_EXPORT_ATTRS.keys())
+ CONTACT_EXPORT_ATTRS
+ list(COMPUTED_CONTACT_EXPORT_ATTRS.keys())
+ BOOKING_EXPORT_ATTRS
+ list(COMPUTED_BOOKING_EXPORT_ATTRS.keys())
)
Expand All @@ -234,6 +244,22 @@ def csv(self, request):
val = cb(self.context, order_data)
val = cleanup_for_csv(val)
order_attrs.append(val)
if CONTACT_EXPORT_ATTRS:
contact_attrs = list()
contact = list(contacts_soup.query(
Eq("uid", order.attrs['contact_uid'])))
if contact:
# contact export attrs
for attr_name in CONTACT_EXPORT_ATTRS:
val = self.export_val(contact[0], attr_name)
contact_attrs.append(val)
# computed contact export attrs
for attr_name in COMPUTED_CONTACT_EXPORT_ATTRS:
cb = COMPUTED_CONTACT_EXPORT_ATTRS[attr_name]
val = cb(self.context, contact[0])
val = cleanup_for_csv(val)
contact_attrs.append(val)

for booking in order_data.bookings:
booking_attrs = list()
# booking export attrs
Expand All @@ -246,7 +272,13 @@ def csv(self, request):
val = cb(self.context, booking)
val = cleanup_for_csv(val)
booking_attrs.append(val)
ex.writerow(order_attrs + booking_attrs)
if six.PY3:
ex.writerow(
[x.decode() if isinstance(x, six.binary_type) else x
for x in order_attrs + contact_attrs + booking_attrs]
)
else:
ex.writerow(order_attrs + contact_attrs + booking_attrs)
booking.attrs["exported"] = True
bookings_soup.reindex(booking)
# create and return response
Expand Down
2 changes: 1 addition & 1 deletion src/bda/plone/orders/profiles/default/metadata.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<metadata>
<version>10</version>
<version>11</version>
<dependencies>
<dependency>profile-collective.js.datatables:default</dependency>
<dependency>profile-bda.plone.checkout:default</dependency>
Expand Down
25 changes: 25 additions & 0 deletions src/bda/plone/orders/upgrades.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
from bda.plone.orders.common import get_order
from bda.plone.orders.common import get_orders_soup
from bda.plone.orders.contacts import get_contacts_soup
from bda.plone.orders.contacts import extract_contact
from bda.plone.orders.contacts import lookup_contact
from bda.plone.orders.contacts import LOOKUP_QUERY_MAPPING
from bda.plone.orders.datamanagers.base import calculate_order_salaried
from bda.plone.orders.datamanagers.base import calculate_order_state
from bda.plone.orders.datamanagers.order import OrderData
Expand All @@ -15,6 +18,7 @@
from decimal import Decimal
from node.ext.zodb.utils import reset_odict
from plone.uuid.interfaces import IUUID
from repoze.catalog.query import Eq
from zope.component.hooks import getSite

import logging
Expand Down Expand Up @@ -424,3 +428,24 @@ def fix_order_state_and_salaried(ctx=None):
order.attrs["state"] = calculate_order_state(bookings)
order.attrs["salaried"] = calculate_order_salaried(bookings)
soup.rebuild()


def fix_order_contact_uid(ctx=None):
"""Add contact_uid to order
"""
portal = getSite()
soup = get_orders_soup(portal)
data = soup.storage.data
need_rebuild = False
for order in data.values():
if not order.attrs.get('contact_uid', None):
lookup_contact(portal, extract_contact(order))
if contact:
order.attrs['contact_uid'] = contact.attrs['uid']
else:
order.attrs['contact_uid'] = ''
need_rebuild = True
logging.info(u"Added contact_uid to order {0}".format(order.attrs["uid"]))
if need_rebuild:
soup.rebuild()
logging.info("Rebuilt contacts catalog")
8 changes: 8 additions & 0 deletions src/bda/plone/orders/upgrades.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,12 @@
profile="bda.plone.orders:default"
handler=".upgrades.fix_order_state_and_salaried" />

<genericsetup:upgradeStep
source="10"
destination="11"
title="Add contact_uid on order"
description=""
profile="bda.plone.orders:default"
handler=".upgrades.fix_order_contact_uid" />

</configure>