def __call__(self): transition = self.request['transition'] uid = self.request['uid'] vendor_uid = self.request.form.get('vendor', '') subtype = self.request.form.get('subtype', '') if vendor_uid: vendor_uids = [vendor_uid] vendor = get_vendor_by_uid(self.context, vendor_uid) user = plone.api.user.get_current() if not user.checkPermission(permissions.ModifyOrders, vendor): raise Unauthorized else: vendor_uids = get_vendor_uids_for() if not vendor_uids: raise Unauthorized if subtype == 'order': record = self._do_transition_for_order( uid, transition, vendor_uids ) elif subtype == 'booking': record = self._do_transition_for_booking( uid, transition, vendor_uids ) else: raise ValueError('subtype must be either "order" or "booking"!') return self.dropdown(self.context, self.request, record).render()
def query2(self, soup): # fetch user vendor uids vendor_uids = get_vendor_uids_for() # filter by given vendor uid or user vendor uids vendor_uid = self.request.form.get('vendor') if vendor_uid: vendor_uid = uuid.UUID(vendor_uid) # raise if given vendor uid not in user vendor uids if vendor_uid not in vendor_uids: raise Unauthorized query = Any('vendor_uids', [vendor_uid]) else: query = Any('vendor_uids', vendor_uids) # filter by customer if given customer = self.request.form.get('customer') if customer: query = query & Eq('creator', customer) # filter by search term if given term = self.request.form['sSearch'].decode('utf-8') if term: query = query & Contains(self.search_text_index, term) # query orders and return result sort = self.sort() res = soup.lazy(query, sort_index=sort['index'], reverse=sort['reverse'], with_size=True) length = res.next() return length, res
def __call__(self): transition = self.request['transition'] uid = self.request['uid'] vendor_uid = self.request.form.get('vendor', '') subtype = self.request.form.get('subtype', '') if vendor_uid: vendor_uids = [vendor_uid] vendor = get_vendor_by_uid(self.context, vendor_uid) user = plone.api.user.get_current() if not user.checkPermission(permissions.ModifyOrders, vendor): raise Unauthorized else: vendor_uids = get_vendor_uids_for() if not vendor_uids: raise Unauthorized if subtype == 'order': record = self._do_transition_for_order(uid, transition, vendor_uids) elif subtype == 'booking': record = self._do_transition_for_booking(uid, transition, vendor_uids) else: raise ValueError('subtype must be either "order" or "booking"!') return self.dropdown(self.context, self.request, record).render()
def order_data(self): vendor_uid = self.request.form.get('vendor', '') if vendor_uid: vendor_uids = [vendor_uid] else: vendor_uids = get_vendor_uids_for() return OrderData(self.context, order=self.record, vendor_uids=vendor_uids)
def booking_data(self): vendor_uid = self.request.form.get('vendor', '') if vendor_uid: vendor_uids = [vendor_uid] else: vendor_uids = get_vendor_uids_for() return BookingData( self.context, booking=self.record, vendor_uids=vendor_uids )
def __call__(self): vendor_uid = self.request.form.get('vendor', '') if vendor_uid: self.vendor_uids = [vendor_uid] vendor = get_vendor_by_uid(self.context, vendor_uid) user = plone.api.user.get_current() if not user.checkPermission(permissions.ModifyOrders, vendor): raise Unauthorized else: self.vendor_uids = get_vendor_uids_for() if not self.vendor_uids: raise Unauthorized return super(OrderView, self).__call__()
def check_modify_order(self, order): vendor_uid = self.request.form.get('vendor', '') if vendor_uid: vendor_uids = [vendor_uid] vendor = get_vendor_by_uid(self.context, vendor_uid) user = plone.api.user.get_current() if not user.checkPermission(permissions.ModifyOrders, vendor): return False else: vendor_uids = get_vendor_uids_for() if not vendor_uids: return False return True
def query(self, soup): # fetch user vendor uids vendor_uids = get_vendor_uids_for() # filter by given vendor uid or user vendor uids vendor_uid = self.request.form.get('vendor') if vendor_uid: vendor_uid = uuid.UUID(vendor_uid) # raise if given vendor uid not in user vendor uids if vendor_uid not in vendor_uids: raise Unauthorized query = Any('vendor_uids', [vendor_uid]) else: query = Any('vendor_uids', vendor_uids) # filter by customer if given customer = self.request.form.get('customer') if customer: query = query & Eq('creator', customer) # Filter by state if given state = self.request.form.get('state') if state: query = query & Eq('state', state) # Filter by salaried if given salaried = self.request.form.get('salaried') if salaried: query = query & Eq('salaried', salaried) # filter by search term if given term = self.request.form['sSearch'].decode('utf-8') if term: # append * for proper fulltext search term += '*' query = query & Contains(self.search_text_index, term) # get buyable uids for given context, get all buyables on site root # use explicit IPloneSiteRoot to make it play nice with lineage if not IPloneSiteRoot.providedBy(self.context): buyable_uids = self._get_buyables_in_context() query = query & Any('buyable_uids', buyable_uids) # query orders and return result sort = self.sort() res = soup.lazy(query, sort_index=sort['index'], reverse=sort['reverse'], with_size=True) length = res.next() #self.request.response.setHeader("Content-type", "application/json") self.request.response.setHeader('X-Theme-Disabled', 'True') return length, res
def query(self, soup): soup.reindex() # fetch user vendor uids vendor_uids = get_vendor_uids_for() # filter by given vendor uid or user vendor uids vendor_uid = self.request.form.get('vendor') if vendor_uid: vendor_uid = uuid.UUID(vendor_uid) # raise if given vendor uid not in user vendor uids if vendor_uid not in vendor_uids: raise Unauthorized query = Any('vendor_uid', [vendor_uid]) else: query = Any('vendor_uid', vendor_uids) # filter by customer if given customer = self.request.form.get('customer') if customer: query = query & Eq('creator', customer) # filter by search term if given term = self.request.form['sSearch'].decode('utf-8') if term: query = query & Contains(self.search_text_index, term) # Show only tickets that are paid query = query & Eq('salaried', 'yes') if not IPloneSiteRoot.providedBy(self.context): buyable_uids = self._get_buyables_in_context() query = query & Any('buyable_uids', buyable_uids) # query orders and return result sort = self.sort() try: res = soup.lazy(query, sort_index=sort['index'], reverse=sort['reverse'], with_size=True) length = res.next() except: length = 0 pass return length, res
def query(self, soup): # fetch user vendor uids vendor_uids = get_vendor_uids_for() # filter by given vendor uid or user vendor uids vendor_uid = self.request.form.get('vendor') if vendor_uid: vendor_uid = uuid.UUID(vendor_uid) # raise if given vendor uid not in user vendor uids if vendor_uid not in vendor_uids: raise Unauthorized query = Any('vendor_uids', [vendor_uid]) else: query = Any('vendor_uids', vendor_uids) # filter by customer if given customer = self.request.form.get('customer') if customer: query = query & Eq('creator', customer) # Filter by state if given state = self.request.form.get('state') if state: query = query & Eq('state', state) # Filter by salaried if given salaried = self.request.form.get('salaried') if salaried: query = query & Eq('salaried', salaried) # filter by search term if given term = self.request.form['sSearch'].decode('utf-8') if term: # append * for proper fulltext search term += '*' query = query & Contains(self.search_text_index, term) # get buyable uids for given context, get all buyables on site root # use explicit IPloneSiteRoot to make it play nice with lineage if not IPloneSiteRoot.providedBy(self.context): buyable_uids = self._get_buyables_in_context() query = query & Any('buyable_uids', buyable_uids) # query orders and return result sort = self.sort() res = soup.lazy(query, sort_index=sort['index'], reverse=sort['reverse'], with_size=True) length = res.next() return length, res
def __call__(self): vendor_uid = self.request.form.get('vendor', '') if vendor_uid: self.vendor_uids = [vendor_uid] vendor = get_vendor_by_uid(self.context, vendor_uid) user = plone.api.user.get_current() if not user.checkPermission(permissions.ModifyOrders, vendor): raise Unauthorized else: self.vendor_uids = get_vendor_uids_for() if not self.vendor_uids: raise Unauthorized # disable diazo theming if ajax call if '_' in self.request.form: self.request.response.setHeader('X-Theme-Disabled', 'True') return super(OrderView, self).__call__()
def __call__(self): transition = self.request['transition'] uid = self.request['uid'] order = get_order(self.context, uid) vendor_uid = self.request.form.get('vendor', '') if vendor_uid: vendor_uids = [vendor_uid] vendor = get_vendor_by_uid(self.context, vendor_uid) user = plone.api.user.get_current() if not user.checkPermission(permissions.ModifyOrders, vendor): raise Unauthorized else: vendor_uids = get_vendor_uids_for() if not vendor_uids: raise Unauthorized transitions = OrderTransitions(self.context) order = transitions.do_transition(uid, vendor_uids, transition) return self.dropdown(self.context, self.request, order).render()
def get_csv(self): context = self.context # prepare csv writer sio = StringIO() ex = csv.writer(sio, dialect='excel-colon', quoting=csv.QUOTE_MINIMAL) # exported column keys as first line ex.writerow(ORDER_EXPORT_ATTRS + list(COMPUTED_ORDER_EXPORT_ATTRS.keys()) + BOOKING_EXPORT_ATTRS + list(COMPUTED_BOOKING_EXPORT_ATTRS.keys())) bookings_soup = get_bookings_soup(context) # First, filter by allowed vendor areas vendor_uids = get_vendor_uids_for() query_b = Any('vendor_uid', vendor_uids) # Second, query for the buyable query_cat = {} query_cat['object_provides'] = IBuyable.__identifier__ query_cat['path'] = '/'.join(context.getPhysicalPath()) cat = getToolByName(context, 'portal_catalog') res = cat(**query_cat) buyable_uids = [IUUID(it.getObject()) for it in res] query_b = query_b & Any('buyable_uid', buyable_uids) all_orders = {} for booking in bookings_soup.query(query_b): booking_attrs = [] # booking export attrs for attr_name in BOOKING_EXPORT_ATTRS: val = self.export_val(booking, attr_name) booking_attrs.append(val) # computed booking export attrs for attr_name in COMPUTED_BOOKING_EXPORT_ATTRS: cb = COMPUTED_BOOKING_EXPORT_ATTRS[attr_name] val = cb(context, booking) val = cleanup_for_csv(val) booking_attrs.append(val) # create order_attrs, if it doesn't exist order_uid = booking.attrs.get('order_uid') if order_uid not in all_orders: order = get_order(context, order_uid) order_data = OrderData(context, order=order, vendor_uids=vendor_uids) order_attrs = [] # order export attrs for attr_name in ORDER_EXPORT_ATTRS: val = self.export_val(order, attr_name) order_attrs.append(val) # computed order export attrs for attr_name in COMPUTED_ORDER_EXPORT_ATTRS: cb = COMPUTED_ORDER_EXPORT_ATTRS[attr_name] val = cb(self.context, order_data) val = cleanup_for_csv(val) order_attrs.append(val) all_orders[order_uid] = order_attrs ex.writerow(all_orders[order_uid] + booking_attrs) # TODO: also set for contextual exports? i'd say no. # booking.attrs['exported'] = True # bookings_soup.reindex(booking) ret = sio.getvalue() sio.close() return ret
def csv(self, request): # get orders soup orders_soup = get_orders_soup(self.context) # get bookings soup bookings_soup = get_bookings_soup(self.context) # fetch user vendor uids vendor_uids = get_vendor_uids_for() # base query for time range query = Ge('created', self.from_date) & Le('created', self.to_date) # filter by given vendor uid or user vendor uids vendor_uid = self.vendor if vendor_uid: vendor_uid = uuid.UUID(vendor_uid) # raise if given vendor uid not in user vendor uids if not vendor_uid in vendor_uids: raise Unauthorized query = query & Any('vendor_uids', [vendor_uid]) else: query = query & Any('vendor_uids', vendor_uids) # filter by customer if given customer = self.customer if customer: query = query & Eq('creator', customer) # prepare csv writer sio = StringIO() ex = csv.writer(sio, dialect='excel-colon') # exported column keys as first line ex.writerow(ORDER_EXPORT_ATTRS + COMPUTED_ORDER_EXPORT_ATTRS.keys() + BOOKING_EXPORT_ATTRS + COMPUTED_BOOKING_EXPORT_ATTRS.keys()) # query orders for order in orders_soup.query(query): # restrict order bookings for current vendor_uids order_data = OrderData(self.context, order=order, vendor_uids=vendor_uids) order_attrs = list() # order export attrs for attr_name in ORDER_EXPORT_ATTRS: val = self.export_val(order, attr_name) order_attrs.append(val) # computed order export attrs for attr_name in COMPUTED_ORDER_EXPORT_ATTRS: cb = COMPUTED_ORDER_EXPORT_ATTRS[attr_name] val = cb(self.context, order_data) order_attrs.append(val) for booking in order_data.bookings: booking_attrs = list() # booking export attrs for attr_name in BOOKING_EXPORT_ATTRS: val = self.export_val(booking, attr_name) booking_attrs.append(val) # computed booking export attrs for attr_name in COMPUTED_BOOKING_EXPORT_ATTRS: cb = COMPUTED_BOOKING_EXPORT_ATTRS[attr_name] val = cb(self.context, booking) booking_attrs.append(val) ex.writerow(order_attrs + booking_attrs) booking.attrs['exported'] = True bookings_soup.reindex(booking) # create and return response s_start = self.from_date.strftime('%G-%m-%d_%H-%M-%S') s_end = self.to_date.strftime('%G-%m-%d_%H-%M-%S') filename = 'orders-export-%s-%s.csv' % (s_start, s_end) self.request.response.setHeader('Content-Type', 'text/csv') self.request.response.setHeader('Content-Disposition', 'attachment; filename=%s' % filename) return sio.getvalue().decode('utf8')
def query(self, soup): self._get_buyables_in_context() req_group_id = self.request.get('group_by', 'email') # if no req group is set if len(req_group_id) == 0: req_group_id = 'email' if req_group_id not in vocabs.groups_vocab(): raise InternalError('Group not allowed!') # not pretty but, otherwise there a problems with vocab + soup attrs # that need many places to refactor to make it work if req_group_id == 'buyable': req_group_id = 'buyable_uid' group_index = soup.catalog[req_group_id] # TODO: This was the fastest produceable way for me to # have an empty query to start with and concenate the rest. queries = [] # fetch user vendor uids vendor_uids = get_vendor_uids_for() # filter by given vendor uid or user vendor uids vendor_uid = self.request.form.get('vendor') if vendor_uid: vendor_uid = uuid.UUID(vendor_uid) # raise if given vendor uid not in user vendor uids if vendor_uid not in vendor_uids: raise Unauthorized queries.append(Eq('vendor_uid', vendor_uid)) # filter by customer if given customer = self.request.form.get('customer') if customer: queries.append(Eq('creator', customer)) # Filter by state if given state = self.request.form.get('state') if state: queries.append(Eq('state', state)) # Filter by salaried if given salaried = self.request.form.get('salaried') if salaried: queries.append(Eq('salaried', salaried)) req_from_date = self.request.get('from_date', '') req_to_date = self.request.get('to_date', '') date_query = self._datetime_checker(req_from_date, req_to_date) if date_query: queries.append(date_query) req_text = self.request.get('search[value]', '') text_query = self._text_checker(req_text) if text_query: queries.append(text_query) if queries: # TODO: See the TODO above. query = queries[0] for q in queries[1:]: query = query & q dummysize, bookings_set = soup.catalog.query(query) else: booking_uids = soup.catalog['uid'] bookings_set = booking_uids._rev_index.keys() bookings_set = set(bookings_set) buyable_index = soup.catalog['buyable_uid'] buyables_set = set() # get all buyables for the current context/path for buyable_uid in self._get_buyables_in_context(): try: buyables_set.update(buyable_index._fwd_index[buyable_uid]) except KeyError: continue # filter bookings_set to only match the current context/path bookings_set = bookings_set.intersection(buyables_set) unique_group_ids = [] # for each booking which matches the query append the qroup id once for group_id, group_booking_ids in group_index._fwd_index.items(): if bookings_set.intersection(group_booking_ids): unique_group_ids.append(group_id) res = odict() size = len(unique_group_ids) # for each unique group id get the matching group booking ids for group_id in self.slice(unique_group_ids): res[group_id] = [] for group_booking_id in group_index._fwd_index[group_id]: if group_booking_id in bookings_set: res[group_id].append(soup.get(group_booking_id)) return size, res
def csv(self, request): # get orders soup orders_soup = get_orders_soup(self.context) # get bookings soup bookings_soup = get_bookings_soup(self.context) # fetch user vendor uids vendor_uids = get_vendor_uids_for() # base query for time range query = Ge('created', self.from_date) & Le('created', self.to_date) # filter by given vendor uid or user vendor uids vendor_uid = self.vendor if vendor_uid: vendor_uid = uuid.UUID(vendor_uid) # raise if given vendor uid not in user vendor uids if vendor_uid not in vendor_uids: raise Unauthorized query = query & Any('vendor_uids', [vendor_uid]) else: query = query & Any('vendor_uids', vendor_uids) # filter by customer if given customer = self.customer if customer: query = query & Eq('creator', customer) # prepare csv writer sio = StringIO() ex = csv.writer(sio, dialect='excel-colon', quoting=csv.QUOTE_MINIMAL) # exported column keys as first line ex.writerow(ORDER_EXPORT_ATTRS + COMPUTED_ORDER_EXPORT_ATTRS.keys() + BOOKING_EXPORT_ATTRS + COMPUTED_BOOKING_EXPORT_ATTRS.keys()) # query orders for order in orders_soup.query(query): # restrict order bookings for current vendor_uids order_data = OrderData(self.context, order=order, vendor_uids=vendor_uids) order_attrs = list() # order export attrs for attr_name in ORDER_EXPORT_ATTRS: val = self.export_val(order, attr_name) order_attrs.append(val) # computed order export attrs for attr_name in COMPUTED_ORDER_EXPORT_ATTRS: cb = COMPUTED_ORDER_EXPORT_ATTRS[attr_name] val = cb(self.context, order_data) val = cleanup_for_csv(val) order_attrs.append(val) for booking in order_data.bookings: booking_attrs = list() # booking export attrs for attr_name in BOOKING_EXPORT_ATTRS: val = self.export_val(booking, attr_name) booking_attrs.append(val) # computed booking export attrs for attr_name in COMPUTED_BOOKING_EXPORT_ATTRS: cb = COMPUTED_BOOKING_EXPORT_ATTRS[attr_name] val = cb(self.context, booking) val = cleanup_for_csv(val) booking_attrs.append(val) ex.writerow(order_attrs + booking_attrs) booking.attrs['exported'] = True bookings_soup.reindex(booking) # create and return response s_start = self.from_date.strftime('%G-%m-%d_%H-%M-%S') s_end = self.to_date.strftime('%G-%m-%d_%H-%M-%S') filename = 'orders-export-%s-%s.csv' % (s_start, s_end) self.request.response.setHeader('Content-Type', 'text/csv') self.request.response.setHeader('Content-Disposition', 'attachment; filename=%s' % filename) ret = sio.getvalue() sio.close() return ret
def get_csv(self): context = self.context # prepare csv writer sio = StringIO() ex = csv.writer(sio, dialect='excel-colon', quoting=csv.QUOTE_MINIMAL) # exported column keys as first line ex.writerow(ORDER_EXPORT_ATTRS + COMPUTED_ORDER_EXPORT_ATTRS.keys() + BOOKING_EXPORT_ATTRS + COMPUTED_BOOKING_EXPORT_ATTRS.keys()) bookings_soup = get_bookings_soup(context) # First, filter by allowed vendor areas vendor_uids = get_vendor_uids_for() query_b = Any('vendor_uid', vendor_uids) # Second, query for the buyable query_cat = {} query_cat['object_provides'] = IBuyable.__identifier__ query_cat['path'] = '/'.join(context.getPhysicalPath()) cat = getToolByName(context, 'portal_catalog') res = cat(**query_cat) buyable_uids = [IUUID(it.getObject()) for it in res] query_b = query_b & Any('buyable_uid', buyable_uids) all_orders = {} for booking in bookings_soup.query(query_b): booking_attrs = [] # booking export attrs for attr_name in BOOKING_EXPORT_ATTRS: val = self.export_val(booking, attr_name) booking_attrs.append(val) # computed booking export attrs for attr_name in COMPUTED_BOOKING_EXPORT_ATTRS: cb = COMPUTED_BOOKING_EXPORT_ATTRS[attr_name] val = cb(context, booking) val = cleanup_for_csv(val) booking_attrs.append(val) # create order_attrs, if it doesn't exist order_uid = booking.attrs.get('order_uid') if order_uid not in all_orders: order = get_order(context, order_uid) order_data = OrderData(context, order=order, vendor_uids=vendor_uids) order_attrs = [] # order export attrs for attr_name in ORDER_EXPORT_ATTRS: val = self.export_val(order, attr_name) order_attrs.append(val) # computed order export attrs for attr_name in COMPUTED_ORDER_EXPORT_ATTRS: cb = COMPUTED_ORDER_EXPORT_ATTRS[attr_name] val = cb(self.context, order_data) val = cleanup_for_csv(val) order_attrs.append(val) all_orders[order_uid] = order_attrs ex.writerow(all_orders[order_uid] + booking_attrs) # TODO: also set for contextual exports? i'd say no. # booking.attrs['exported'] = True # bookings_soup.reindex(booking) ret = sio.getvalue() sio.close() return ret