Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
  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
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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
     )
Ejemplo n.º 8
0
 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
     )
Ejemplo n.º 9
0
 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__()
Ejemplo n.º 10
0
 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__()
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
    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
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
0
 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__()
Ejemplo n.º 17
0
 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()
Ejemplo n.º 18
0
    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
Ejemplo n.º 19
0
 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')
Ejemplo n.º 20
0
    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
Ejemplo n.º 21
0
    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
Ejemplo n.º 22
0
 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
Ejemplo n.º 23
0
    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