def get_start_and_end_from_request(request): """Get start and end dates from request. Returns: date, date or None, None """ start = getattr(request, request.method).get("start", None) if start: start = expand_datestring_without_day(start) end = getattr(request, request.method).get("end", None) if end: end = expand_datestring_without_day(end) if "days" in getattr(request, request.method): days = getattr(request, request.method).get("days", None) else: days = getattr(request, request.method).get("quantity", None) if start and (end or days): start_date = parse_date(start) if end: end_date = parse_date(end) else: end_date = start_date + timedelta(days=int(days)) else: return None, None return start_date, end_date
def group_by_period(queryset, column, period, **annotate): """ Group and annotate given queryset by a given date period. :param queryset: Original queryset :type queryset: django.db.QuerySet :param column: Column for grouping :type column: str :param period: Period for grouping ('year', 'month', 'day') :type period: str :param annotate: Dict for `.annotate()` :type annotate: dict[str,str] :return: OrderedDict of period -> annotate columns :rtype: collections.OrderedDict """ # Based on http://stackoverflow.com/a/8746532/51685 d = OrderedDict() for line in ( queryset .extra({"period_group": connection.ops.date_trunc_sql(period, column)}) .values("period_group") .annotate(**annotate) .order_by("period_group") .values(*["period_group"] + list(annotate.keys())) ): d[parse_date(line.pop("period_group"))] = line return d
def group_by_period(queryset, column, period, **annotate): """ Group and annotate given queryset by a given date period. :param queryset: Original queryset :type queryset: django.db.QuerySet :param column: Column for grouping :type column: str :param period: Period for grouping ('year', 'month', 'day') :type period: str :param annotate: Dict for `.annotate()` :type annotate: dict[str,str] :return: OrderedDict of period -> annotate columns :rtype: collections.OrderedDict """ # Based on http://stackoverflow.com/a/8746532/51685 d = OrderedDict() for line in (queryset.extra({ "period_group": connection.ops.date_trunc_sql(period, column) }).values("period_group").annotate( **annotate).order_by("period_group").values( *["period_group"] + list(annotate.keys()))): d[parse_date(line.pop("period_group"))] = line return d
def get_order_details(order): details = [] for line in order.lines.filter(type=OrderLineType.PRODUCT): details.append("%s" % line.text) if line.product.type.identifier == "reservable": start = parse_date(line.extra_data["reservation_start"]) end = start + datetime.timedelta(days=int(line.quantity)) details.append(ugettext(" {nights} nights, {persons} persons, {start} - {end}".format( nights=int(line.quantity), persons=line.extra_data["persons"], start=start, end=end) )) return "\n".join(details)
def add_product(self, supplier, shop, product, quantity, force_new_line=False, extra=None, parent_line=None): if not extra: extra = {} if self.request.POST.get("start", None): extra["reservation_start"] = parse_date(self.request.POST.get("start")) extra["persons"] = self.request.POST.get("persons", 1) # TODO: enable this here once https://github.com/shoopio/shoop/issues/291 is resolved in some way # Currently setting `force_new_line` causes product not to be added at all. # Once this works, remove above override of `_compare_line_for_addition`. # if product.type.identifier == "reservable": # force_new_line = True return super(ReservableBasket, self).add_product( supplier, shop, product, quantity, force_new_line=force_new_line, extra=extra, parent_line=parent_line)
def _set_datetime_value(self, new_value): if self.attribute.type == AttributeType.DATETIME: # Just store datetimes if not isinstance(new_value, datetime.datetime): raise TypeError("Can't assign %r to DATETIME attribute" % new_value) self.datetime_value = new_value self.numeric_value = calendar.timegm(self.datetime_value.timetuple()) self.untranslated_string_value = self.datetime_value.isoformat() elif self.attribute.type == AttributeType.DATE: # Store dates as "date at midnight" date = parse_date(new_value) self.datetime_value = datetime.datetime.combine(date=date, time=datetime.time()) self.numeric_value = date.toordinal() # Store date ordinal as numeric value self.untranslated_string_value = date.isoformat() # Store date ISO format as string value
def get_order_details(order): details = [] for line in order.lines.filter(type=OrderLineType.PRODUCT): details.append("%s" % line.text) if line.product.type.identifier == "reservable": start = parse_date(line.extra_data["reservation_start"]) end = start + datetime.timedelta(days=int(line.quantity)) details.append( ugettext( " {nights} nights, {persons} persons, {start} - {end}". format(nights=int(line.quantity), persons=line.extra_data["persons"], start=start, end=end))) return "\n".join(details)