Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
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)