forked from rc/aircox
		
	
		
			
				
	
	
		
			128 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
"""
 | 
						|
Manage diffusions using schedules, to update, clean up or check diffusions.
 | 
						|
 | 
						|
A generated diffusion can be unconfirmed, that means that the user must confirm
 | 
						|
it by changing its type to "normal". The behaviour is controlled using
 | 
						|
--approval.
 | 
						|
"""
 | 
						|
import datetime
 | 
						|
import logging
 | 
						|
from argparse import RawTextHelpFormatter
 | 
						|
 | 
						|
from django.core.management.base import BaseCommand
 | 
						|
from django.db import transaction
 | 
						|
from django.utils import timezone as tz
 | 
						|
 | 
						|
from aircox.models import Schedule, Diffusion
 | 
						|
 | 
						|
logger = logging.getLogger('aircox.commands')
 | 
						|
 | 
						|
 | 
						|
class Actions:
 | 
						|
    date = None
 | 
						|
 | 
						|
    def __init__(self, date):
 | 
						|
        self.date = date or datetime.date.today()
 | 
						|
 | 
						|
    def update(self):
 | 
						|
        episodes, diffusions = [], []
 | 
						|
        for schedule in Schedule.objects.filter(program__active=True,
 | 
						|
                                                initial__isnull=True):
 | 
						|
            eps, diffs = schedule.diffusions_of_month(self.date)
 | 
						|
 | 
						|
            episodes += eps
 | 
						|
            diffusions += diffs
 | 
						|
 | 
						|
            logger.info('[update] %s: %d episodes, %d diffusions and reruns',
 | 
						|
                        str(schedule), len(eps), len(diffs))
 | 
						|
 | 
						|
        with transaction.atomic():
 | 
						|
            logger.info('[update] save %d episodes and %d diffusions',
 | 
						|
                        len(episodes), len(diffusions))
 | 
						|
            for episode in episodes:
 | 
						|
                episode.save()
 | 
						|
            for diffusion in diffusions:
 | 
						|
                # force episode id's update
 | 
						|
                diffusion.episode = diffusion.episode
 | 
						|
                diffusion.save()
 | 
						|
 | 
						|
    def clean(self):
 | 
						|
        qs = Diffusion.objects.filter(type=Diffusion.TYPE_UNCONFIRMED,
 | 
						|
                                      start__lt=self.date)
 | 
						|
        logger.info('[clean] %d diffusions will be removed', qs.count())
 | 
						|
        qs.delete()
 | 
						|
 | 
						|
    def check(self):
 | 
						|
        # TODO: redo
 | 
						|
        qs = Diffusion.objects.filter(type=Diffusion.TYPE_UNCONFIRMED,
 | 
						|
                                      start__gt=self.date)
 | 
						|
        items = []
 | 
						|
        for diffusion in qs:
 | 
						|
            schedules = Schedule.objects.filter(program=diffusion.program)
 | 
						|
            for schedule in schedules:
 | 
						|
                if schedule.match(diffusion.start):
 | 
						|
                    break
 | 
						|
            else:
 | 
						|
                items.append(diffusion.id)
 | 
						|
 | 
						|
        logger.info('[check] %d diffusions will be removed', len(items))
 | 
						|
        if items:
 | 
						|
            Diffusion.objects.filter(id__in=items).delete()
 | 
						|
 | 
						|
 | 
						|
class Command(BaseCommand):
 | 
						|
    help = __doc__
 | 
						|
 | 
						|
    def add_arguments(self, parser):
 | 
						|
        parser.formatter_class = RawTextHelpFormatter
 | 
						|
        today = datetime.date.today()
 | 
						|
 | 
						|
        group = parser.add_argument_group('action')
 | 
						|
        group.add_argument(
 | 
						|
            '-u', '--update', action='store_true',
 | 
						|
            help='generate (unconfirmed) diffusions for the given month. '
 | 
						|
                 'These diffusions must be confirmed manually by changing '
 | 
						|
                 'their type to "normal"'
 | 
						|
        )
 | 
						|
        group.add_argument(
 | 
						|
            '-l', '--clean', action='store_true',
 | 
						|
            help='remove unconfirmed diffusions older than the given month'
 | 
						|
        )
 | 
						|
        group.add_argument(
 | 
						|
            '-c', '--check', action='store_true',
 | 
						|
            help='check unconfirmed later diffusions from the given '
 | 
						|
                 'date agains\'t schedule. If no schedule is found, remove '
 | 
						|
                 'it.'
 | 
						|
        )
 | 
						|
 | 
						|
        group = parser.add_argument_group('date')
 | 
						|
        group.add_argument(
 | 
						|
            '--year', type=int, default=today.year,
 | 
						|
            help='used by update, default is today\'s year')
 | 
						|
        group.add_argument(
 | 
						|
            '--month', type=int, default=today.month,
 | 
						|
            help='used by update, default is today\'s month')
 | 
						|
        group.add_argument(
 | 
						|
            '--next-month', action='store_true',
 | 
						|
            help='set the date to the next month of given date'
 | 
						|
                 ' (if next month from today'
 | 
						|
        )
 | 
						|
 | 
						|
    def handle(self, *args, **options):
 | 
						|
        date = datetime.date(year=options['year'], month=options['month'],
 | 
						|
                             day=1)
 | 
						|
        if options.get('next_month'):
 | 
						|
            month = options.get('month')
 | 
						|
            date += tz.timedelta(days=28)
 | 
						|
            if date.month == month:
 | 
						|
                date += tz.timedelta(days=28)
 | 
						|
            date = date.replace(day=1)
 | 
						|
 | 
						|
        actions = Actions(date)
 | 
						|
        if options.get('update'):
 | 
						|
            actions.update()
 | 
						|
        if options.get('clean'):
 | 
						|
            actions.clean()
 | 
						|
        if options.get('check'):
 | 
						|
            actions.check()
 |