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')
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')
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')
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')
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)