Source code for akvo.rsr.management.commands.project_cleanup

# -*- coding: utf-8 -*-

# Akvo Reporting is covered by the GNU Affero General Public License.
# See more details in the license.txt file located at the root folder of the Akvo RSR module.
# For additional details on the GNU license please see < http://www.gnu.org/licenses/agpl.html >.

from django.core.management.base import BaseCommand
from django.utils import timezone
from datetime import timedelta
from ...models import Project, PublishingStatus


[docs]class Command(BaseCommand): help = 'Script for cleaning up empty projects'
[docs] def add_arguments(self, parser): parser.add_argument( '-n', '--num-days', action='store', dest='num_days', default=7, help='Filter projects older than \'n\' days' ) parser.add_argument( '-d', '--delete', action='store_true', dest='delete', default=False, help='Delete filtered projects in addition to listing them' )
[docs] def handle(self, *args, **options): # parse options verbosity = int(options['verbosity']) delete = bool(options['delete']) num_days = int(options['num_days']) # set filter date filter_date = timezone.now() - timedelta(days=num_days) if verbosity > 1: self.stdout.write('Pruning date: {0}'.format(str(filter_date))) # filter empty projects if verbosity > 0: self.stdout.write('Filtering all empty projects older than {0} days.'.format( str(num_days))) filter_projects = Project.objects.filter( publishingstatus__status=PublishingStatus.STATUS_UNPUBLISHED ).exclude(created_at__gt=filter_date) empty_projects = [p for p in filter_projects if p.is_empty()] for n, p in enumerate(empty_projects): if verbosity > 1: self.stdout.write('- [{0}/{1}] Empty project by {2} (created {3}) '.format( str(n + 1), str(len(empty_projects)), p.primary_organisation.name.encode('ascii', 'ignore'), str(p.created_at) )) if delete: p.delete() # delete filtered projects if delete: if verbosity > 0: self.stdout.write( '{0} projects(s) matched filter and were successfully removed.'.format( str(len(empty_projects)))) elif verbosity > 0: self.stdout.write( '{0} projects(s) matched filter, use \'-d\' flag to remove them.'.format( str(len(empty_projects))))