src/ldt/ldt/management/commands/mergeprojects.py
author ymh <ymh.work@gmail.com>
Mon, 19 Oct 2015 09:54:57 +0200
changeset 1461 fff3ef58e8e3
parent 1458 fe2ec4cb6183
child 1465 74b0b90517ed
permissions -rw-r--r--
just add the project id to output
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1458
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import itertools
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
from django.contrib.auth import get_user_model
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.core.management.base import NoArgsCommand, CommandError
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.db.models import Q
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from ldt.ldt_utils.models  import Project, Content
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from ldt.ldt_utils.modelsutils  import ProjectMerger
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
class Command(NoArgsCommand):
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    """
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
    Merge projects.
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    Beware this version of the command correctly support merging projects from only one content.
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    Usage:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
        -p <project_id>: project id, can have more than one
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
        -c <content_id>: content id, can have more than one
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
        -t <title>: project title (default merge of "projects title")
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
        -u <user>: user for project (defaut admin)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
        --only-visible: only visible cuttings (default false)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
        --exclude-shot-by-shot: remove shot by shot (default false)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
        --all-published: merge all projects published or not (default false)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    """
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    help = 'Merge projects'
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    def add_arguments(self, parser):
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
        # Named (optional) arguments
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        parser.add_argument(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
            '--only-visible',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
            action='store_true',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
            dest='visible',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
            default=False,
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
            help='merge only visible cuttings')
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
        parser.add_argument(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
            '--exclude-shot-by-shot',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
            action='store_true',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
            dest='exclude_shot_by_shot',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
            default=False,
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
            help='exclude shot by shot cuttings')
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        parser.add_argument(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
            '--all-published',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
            action='store_true',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
            dest='all_published',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            default=False,
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
            help='merge all projects published or not')
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        parser.add_argument(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
            '-p', '--project',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
            action='append',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
            dest='projects',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
            metavar='PROJECT_ID',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
            default=[],
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
            help='project id to concatenate')
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        parser.add_argument(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            '-c', '--content',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
            action='store',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            dest='contents',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
            default=None,
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
            metavar='CONTENT_ID',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
            help='content id to concatenate')
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        parser.add_argument(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
            '-t', '--title',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
            action='store',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
            dest='title',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            metavar='TITLE',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            help='The title for the merged project. defaut "merged: title1, title2,..."'
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        )
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        parser.add_argument(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            '-u', '--user',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            action='store',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
            dest='user',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
            metavar='USER',
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
            help='The user creator of the merged project'
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        )
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    def handle_noargs(self, **options):
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        # pylint: disable=C0103
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        User = get_user_model()
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
        username = options.get('user', None)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        if not username:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
            users = User.objects.filter(is_superuser=True).order_by('date_joined')
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
            if len(users) > 0:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
                user = users[0]
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
                username = user.username
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
            else:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
                raise CommandError("No username given and can not fond a superuser")
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        else:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            user = User.objects.get(username=username)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        # filter projects
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        project_filter = Q()
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
        projects_ids = options.get('projects', None)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        if projects_ids:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
            project_filter &= Q(ldt_id__in=projects_ids)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        content_id = options.get('contents', None)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        if content_id:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
            project_filter = Q(contents__iri_id__in=[content_id,])
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
        if not projects_ids and not content_id:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
            raise CommandError("At least one content or project must be specified")
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        if not options.get('all_published', False):
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
            project_filter &= Q(state=Project.PUBLISHED)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        projects = Project.objects.filter(project_filter)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        if len(projects) == 0:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
            raise CommandError("No project found, aborting")
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        title = options.get('title', "")
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        if not title:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
            title = "Merged: " + ", ".join([p.title.strip() for p in projects])
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        contents = set(itertools.chain(*[proj.contents.all() for proj in projects]))
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        if len(contents) == 0:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
            raise CommandError("Content not found")
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        if len(contents) > 1 and not content_id:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
            raise CommandError("Too many contents %d" % len(contents))
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
        if content_id:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
            content = Content.objects.get(iri_id=content_id)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
        else:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
            content = contents[0]
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        if options.get('verbosity', 1) > 0:
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
            print("Merging %d projects in \'%s\'" % (len(projects), title))
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
        pmerger = ProjectMerger(content, projects)
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        proj = pmerger.get_merged_project(
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
            only_visible=not options.get('visible', False),
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
            shot_by_shot=not options.get('exclude_shot_by_shot', False))
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
        proj.created_by = username
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
        proj.changed_by = username
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
        proj.owner = user
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
        proj.title = title
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
        proj.save()
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
fe2ec4cb6183 add command to merge projects.
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
        if options.get('verbosity', 1) > 0:
1461
fff3ef58e8e3 just add the project id to output
ymh <ymh.work@gmail.com>
parents: 1458
diff changeset
   154
            print("Project \'%s\' created with id '%s'" % (title, proj.ldt_id))