예제 #1
0
 def handle(self, *args, **options):
     depots = Depot.objects.all().order_by('code')
     products = Product.objects.all().order_by('id')
     for depot in depots:
         depot.fill_overview_cache()
         depot.fill_active_subscription_cache()
     renderdict = {'depots': depots, 'products': products}
     render_to_pdf_storage('cs/exports/cs_depolist.html', renderdict,
                           'cs_depolist.pdf')
예제 #2
0
    def handle(self, *args, **options):
        if not options['force'] and timezone.now().weekday(
        ) not in Config.depot_list_generation_days():
            print(
                'not the specified day for depot list generation, use --force to override'
            )
            return
        depots = CsDepot.objects.all().order_by('sort_order')
        products = Product.objects.all().order_by('code')
        latest_delivery = CustomDelivery.objects.all().order_by(
            '-delivery_date')[0]

        # Rename products based on their name in the latest delivery
        deliveryProducts = []
        for product in products:
            if latest_delivery.items.filter(product=product):
                for deliveryProduct in latest_delivery.items.filter(
                        product=product):
                    renamedProduct = copy.deepcopy(product)
                    renamedProduct.name = deliveryProduct.name
                    deliveryProducts.append(renamedProduct)
            else:
                deliveryProducts.append(product)

        overallTotal = [0] * len(deliveryProducts)
        grouped_depots = {}
        for depot in depots:
            grouped_depots.setdefault(depot.weekday_name, []).append(depot)
        totals = {}
        for weekday, depot_list in grouped_depots.items():
            total = [0] * len(deliveryProducts)
            for depot in depot_list:
                product_totals = depot.product_totals
                for idx, prod in enumerate(deliveryProducts):
                    total[idx] = total[idx] + product_totals[prod]
                    overallTotal[
                        idx] = overallTotal[idx] + product_totals[prod]
            totals[weekday] = total

        renderdict_depotlist = {
            'depots': depots,
            'products': deliveryProducts,
            'comment': latest_delivery.delivery_comment
        }
        render_to_pdf_storage('cs/exports/cs_depolist.html',
                              renderdict_depotlist, 'depotlist.pdf')

        renderdict_packlist = {
            'depots': grouped_depots,
            'products': deliveryProducts,
            'totals': totals,
            'overallTotals': overallTotal
        }
        render_to_pdf_storage('cs/exports/cs_packlist.html',
                              renderdict_packlist, 'depot_overview.pdf')
예제 #3
0
    def handle(self, *args, **options):
        if not options['force'] and timezone.now().weekday(
        ) not in Config.depot_list_generation_days():
            print(
                'not the specified day for depot list generation, use --force to override'
            )
            return

        if options['future'] or timezone.now().weekday(
        ) in Config.depot_list_generation_days():
            for subscription in SubscriptionDao.subscritions_with_future_depots(
            ):
                subscription.depot = subscription.future_depot
                subscription.future_depot = None
                subscription.save()
                emails = []
                for member in subscription.recipients:
                    emails.append(member.email)
                membernotification.depot_changed(emails, subscription.depot)

        if options['force'] and not options['future']:
            print('future depots ignored, use --future to override')

        depot_dict = {
            'subscriptions':
            SubscriptionDao.all_active_subscritions(),
            'products':
            SubscriptionProductDao.get_all_for_depot_list(),
            'extra_sub_categories':
            ExtraSubscriptionCategoryDao.categories_for_depot_list_ordered(),
            'depots':
            DepotDao.all_depots_order_by_code(),
            'weekdays': {
                weekdays[weekday['weekday']]: weekday['weekday']
                for weekday in DepotDao.distinct_weekdays()
            },
            'messages':
            ListMessageDao.all_active()
        }

        render_to_pdf_storage('exports/depotlist.html', depot_dict,
                              'depotlist.pdf')
        render_to_pdf_storage('exports/depot_overview.html', depot_dict,
                              'depot_overview.pdf')
        render_to_pdf_storage('exports/amount_overview.html', depot_dict,
                              'amount_overview.pdf')
예제 #4
0
    def handle(self, *args, **options):
        if not options['force'] and timezone.now().weekday(
        ) not in Config.depot_list_generation_days():
            print(
                'not the specified day for depot list generation, use --force to override'
            )
            return

        if options['future'] or timezone.now().weekday(
        ) in Config.depot_list_generation_days():
            for subscription in SubscriptionDao.subscritions_with_future_depots(
            ):
                subscription.depot = subscription.future_depot
                subscription.future_depot = None
                subscription.save()
                emails = []
                for member in subscription.recipients():
                    emails.append(member.email)
                send_depot_changed(emails, subscription.depot)

        if options['force'] and not options['future']:
            print('future depots ignored, use --future to override')

        depots = DepotDao.all_depots_order_by_code()

        subscription_names = []
        for subscription_size in SubscriptionSizeDao.sizes_for_depot_list():
            subscription_names.append(subscription_size.name)

        categories = []
        types = []
        for category in ExtraSubscriptionCategoryDao.all_categories_ordered():
            cat = {'name': category.name, 'description': category.description}
            count = 0
            for extra_subscription in ExtraSubscriptionTypeDao.extra_types_by_category_ordered(
                    category):
                count += 1
                type = {
                    'name': extra_subscription.name,
                    'size': extra_subscription.size,
                    'last': False
                }
                types.append(type)
            type['last'] = True
            cat['count'] = count
            categories.append(cat)

        used_weekdays = []
        for item in DepotDao.distinct_weekdays():
            used_weekdays.append(weekdays[item['weekday']])

        overview = {'all': None}
        for weekday in used_weekdays:
            overview[weekday] = None

        count = len(types) + len(subscription_names)
        for weekday in used_weekdays:
            overview[weekday] = [0] * count
        overview['all'] = [0] * count

        all = overview.get('all')

        for depot in depots:
            depot.fill_overview_cache()
            depot.fill_active_subscription_cache()
            row = overview.get(depot.get_weekday_display())
            count = 0
            # noinspection PyTypeChecker
            while count < len(row):
                row[count] += depot.overview_cache[count]
                all[count] += depot.overview_cache[count]
                count += 1

        insert_point = len(subscription_names)
        for weekday in used_weekdays:
            overview[weekday].insert(insert_point, 0)
        overview['all'].insert(insert_point, 0)

        index = 0
        for subscription_size in SubscriptionSizeDao.sizes_for_depot_list():
            for weekday in used_weekdays:
                overview[weekday][insert_point] = overview[weekday][insert_point] + subscription_size.size * \
                                                                                      overview[weekday][index]
            overview['all'][insert_point] = overview['all'][
                insert_point] + subscription_size.size * overview['all'][index]
            index += 1

        renderdict = {
            'overview': overview,
            'depots': depots,
            'subscription_names': subscription_names,
            'subscriptioncount': len(subscription_names) + 1,
            'categories': categories,
            'types': types,
            'datum': timezone.now(),
            'weekdays': used_weekdays
        }

        render_to_pdf_storage('exports/legacy.html', renderdict, 'dpl.pdf')
        render_to_pdf_storage('exports/depotlist.html', renderdict,
                              'depotlist.pdf')
        render_to_pdf_storage('exports/depot_overview.html', renderdict,
                              'depot_overview.pdf')
        render_to_pdf_storage('exports/amount_overview.html', renderdict,
                              'amount_overview.pdf')
예제 #5
0
    def handle(self, *args, **options):
        if not options['force'] and timezone.now().weekday(
        ) not in Config.depot_list_generation_days():
            print(
                'not the specified day for depot list generation, use --force to override'
            )
            return

        if options['future'] or timezone.now().weekday(
        ) in Config.depot_list_generation_days():
            activate_future_depots()

        if options['force'] and not options['future']:
            print('future depots ignored, use --future to override')

        products = [{
            'name': 'Gemüse',
            'sizes': [{
                'name': 'Tasche',
                'key': 'gmues'
            }]
        }, {
            'name': 'Obst',
            'sizes': [{
                'name': 'Portion',
                'key': 'obst'
            }]
        }, {
            'name': 'Brot',
            'sizes': [{
                'name': '500g',
                'key': 'brot'
            }]
        }, {
            'name': 'Eier',
            'sizes': [{
                'name': '4er',
                'key': 'eier'
            }]
        }, {
            'name': 'Tofu',
            'sizes': [{
                'name': 'Portion',
                'key': 'tofu'
            }]
        }]

        gmues_types = SubscriptionType.objects.filter(
            pk__in=[6, 7, 8, 9, 10, 11, 12, 13, 18])
        obst_types = SubscriptionType.objects.filter(pk__in=[
            6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22
        ])
        brot_types = SubscriptionType.objects.filter(
            pk__in=[8, 9, 12, 13, 16, 17, 19, 20])
        tofu_types = ExtraSubscriptionType.objects.filter(pk__in=[11])
        eier_types = ExtraSubscriptionType.objects.filter(pk__in=[1])

        now = dateformat.format(timezone.now(), 'Y-m-d')

        subs = SubscriptionDao.all_active_subscritions(). \
            annotate(gmues=Count('parts',
                                 filter=Q(parts__type__in=gmues_types) & Q(
                                     parts__activation_date__lte=now) & (Q(
                                     parts__deactivation_date__isnull=True) | Q(parts__deactivation_date__gte=now)),
                                 distinct=True)). \
            annotate(obst=Count('parts',
                                filter=Q(parts__type__in=obst_types) & Q(parts__activation_date__lte=now) & (Q(
                                    parts__deactivation_date__isnull=True) | Q(parts__deactivation_date__gte=now)),
                                distinct=True)). \
            annotate(brot=Count('parts',
                                filter=Q(parts__type__in=brot_types) & Q(parts__activation_date__lte=now) & (Q(
                                    parts__deactivation_date__isnull=True) | Q(
                                    parts__deactivation_date__gte=now)), distinct=True)). \
            annotate(tofu=Count('extra_subscription_set', filter=Q(extra_subscription_set__type__in=tofu_types) & Q(
            extra_subscription_set__activation_date__lte=now) & (Q(
            extra_subscription_set__deactivation_date__isnull=True) | Q(
            extra_subscription_set__deactivation_date__gte=now)), distinct=True)). \
            annotate(eier=Count('extra_subscription_set', filter=Q(extra_subscription_set__type__in=eier_types) & Q(
            extra_subscription_set__activation_date__lte=now) & (Q(
            extra_subscription_set__deactivation_date__isnull=True) | Q(
            extra_subscription_set__deactivation_date__gte=now)), distinct=True))

        depots = DepotDao.all_depots_order_by_code().prefetch_related('subscription_set'). \
            annotate(
            gmues=Count('subscription_set__parts', filter=Q(subscription_set__parts__type__in=gmues_types) & Q(
                subscription_set__parts__activation_date__lte=now) & (Q(
                subscription_set__parts__deactivation_date__isnull=True) | Q(
                subscription_set__parts__deactivation_date__gte=now)), distinct=True)). \
            annotate(
            obst=Count('subscription_set__parts', filter=Q(subscription_set__parts__type__in=obst_types) & Q(
                subscription_set__parts__activation_date__lte=now) & (Q(
                subscription_set__parts__deactivation_date__isnull=True) | Q(
                subscription_set__parts__deactivation_date__gte=now)), distinct=True)). \
            annotate(
            brot=Count('subscription_set__parts', filter=Q(subscription_set__parts__type__in=brot_types) & Q(
                subscription_set__parts__activation_date__lte=now) & (Q(
                subscription_set__parts__deactivation_date__isnull=True) | Q(
                subscription_set__parts__deactivation_date__gte=now)), distinct=True)). \
            annotate(tofu=Count('subscription_set__extra_subscription_set',
                                filter=Q(subscription_set__extra_subscription_set__type__in=tofu_types) & Q(
                                    subscription_set__extra_subscription_set__activation_date__lte=now) & (Q(
                                    subscription_set__extra_subscription_set__deactivation_date__isnull=True) | Q(
                                    subscription_set__extra_subscription_set__deactivation_date__gte=now)),
                                distinct=True)). \
            annotate(eier=Count('subscription_set__extra_subscription_set',
                                filter=Q(subscription_set__extra_subscription_set__type__in=eier_types) & Q(
                                    subscription_set__extra_subscription_set__activation_date__lte=now) & (Q(
                                    subscription_set__extra_subscription_set__deactivation_date__isnull=True) | Q(
                                    subscription_set__extra_subscription_set__deactivation_date__gte=now)),
                                distinct=True))

        days = Depot.objects.all().prefetch_related('subscription_set'). \
            values('weekday').order_by('weekday'). \
            annotate(
            gmues=Count('subscription_set__parts', filter=Q(subscription_set__parts__type__in=gmues_types) & Q(
                subscription_set__parts__activation_date__lte=now) & (Q(
                subscription_set__parts__deactivation_date__isnull=True) | Q(
                subscription_set__parts__deactivation_date__gte=now)), distinct=True)). \
            annotate(
            obst=Count('subscription_set__parts', filter=Q(subscription_set__parts__type__in=obst_types) & Q(
                subscription_set__parts__activation_date__lte=now) & (Q(
                subscription_set__parts__deactivation_date__isnull=True) | Q(
                subscription_set__parts__deactivation_date__gte=now)), distinct=True)). \
            annotate(
            brot=Count('subscription_set__parts', filter=Q(subscription_set__parts__type__in=brot_types) & Q(
                subscription_set__parts__activation_date__lte=now) & (Q(
                subscription_set__parts__deactivation_date__isnull=True) | Q(
                subscription_set__parts__deactivation_date__gte=now)), distinct=True)). \
            annotate(tofu=Count('subscription_set__extra_subscription_set',
                                filter=Q(subscription_set__extra_subscription_set__type__in=tofu_types) & Q(
                                    subscription_set__extra_subscription_set__activation_date__lte=now) & (Q(
                                    subscription_set__extra_subscription_set__deactivation_date__isnull=True) | Q(
                                    subscription_set__extra_subscription_set__deactivation_date__gte=now)),
                                distinct=True)). \
            annotate(eier=Count('subscription_set__extra_subscription_set',
                                filter=Q(subscription_set__extra_subscription_set__type__in=eier_types) & Q(
                                    subscription_set__extra_subscription_set__activation_date__lte=now) & (Q(
                                    subscription_set__extra_subscription_set__deactivation_date__isnull=True) | Q(
                                    subscription_set__extra_subscription_set__deactivation_date__gte=now)),
                                distinct=True))

        for day in days:
            day['name'] = weekdays[day['weekday']]

        for product in products:
            for size in product['sizes']:
                total = 0
                for day in days:
                    total += day[size['key']]
                size['total'] = total

        depot_dict = {
            'weekdays': days,
            'depots': depots,
            'products': products,
            'subscriptions': subs,
            'messages': ListMessageDao.all_active(),
        }

        render_to_pdf_storage('exports_oooo/depotlist.html', depot_dict,
                              'depotlist.pdf')
        render_to_pdf_storage('exports_oooo/depot_overview.html', depot_dict,
                              'depot_overview.pdf')
        render_to_pdf_storage('exports_oooo/amount_overview.html', depot_dict,
                              'amount_overview.pdf')

        # cleanup files from preview runs
        legacy_files = [
            'depotlist_pre.pdf', 'depot_overview_pre.pdf',
            'amount_overview_pre.pdf'
        ]
        for file in legacy_files:
            if default_storage.exists(file):
                default_storage.delete(file)