Exemple #1
0
    def get_view(self, request):
        moderated_items = registry.get_by_user(request.user)

        ctx = {
            "moderated_item": registry.get_by_name(self.name),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        if request.method == 'POST':
            ctx['form'] = TagCreateAliasForm(request.POST)
            if ctx['form'].is_valid():
                cleaned_data = ctx['form'].cleaned_data

                tag = cleaned_data['tag']
                aliases = cleaned_data['aliases']

                already_added = TagAlias.objects.filter(tag=tag)
                for added in already_added:
                    if added.name in aliases:
                        aliases.remove(added.name)
                    else:
                        added.delete()

                for alias in aliases:
                    TagAlias.objects.create(tag=tag, name=alias)

                messages.add_message(request, messages.INFO,
                                     _("Alias created!"))
                return redirect(self.get_absolute_url())

        else:
            ctx['form'] = TagCreateAliasForm()

        return render(request, 'moderation/tag_aliases/create.html', ctx)
Exemple #2
0
    def get_view(self, request):
        moderated_items = registry.get_by_user(request.user)

        ctx = {
            "moderated_item": registry.get_by_name(self.name),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        if request.method == 'POST':
            ctx['form'] = TagTranslationForm(request.POST)
            if ctx['form'].is_valid():
                cleaned_data = ctx['form'].cleaned_data

                f = cleaned_data['f']
                t = cleaned_data['t']

                TagTranslation.create_translation(f, t)

                messages.add_message(request, messages.INFO,
                                     _("Tag translated!"))
                return redirect(self.get_absolute_url())

        else:
            ctx['form'] = TagTranslationForm()

        return render(request, 'moderation/tag_translation/create.html', ctx)
    def get_view( self, request ):
        moderated_items = registry.get_by_user( request.user )

        ctx = {
            "moderated_item": registry.get_by_name( self.name ),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        lang = settings.LANGUAGE_CODE
        to_lang = TagTranslation.to_lang()
        
        if request.method == 'POST':
            for f, t in request.POST.items():
                TagTranslation.create_translation( f, t )
        
            if request.is_ajax():
                return HttpResponse( json.dumps( { 'success': True  } ) )

        kwargs = {
            "%s__isnull" % to_lang: False
        }
        translated = [ t[lang] for t in TagTranslation.objects.filter( **kwargs ).values( lang ) ]
        ctx['items'] = Tag.objects.all().exclude( name__in=translated ).order_by( 'weight' )
        ctx['lang'] = lang
        ctx['to_lang'] = to_lang

        return render( request, 'moderation/tag_translation/list.html', ctx )
Exemple #4
0
    def get_view(self, request):
        moderated_items = registry.get_by_user(request.user)

        ctx = {
            "moderated_item": registry.get_by_name(self.name),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        lang = settings.LANGUAGE_CODE
        to_lang = TagTranslation.to_lang()

        if request.method == 'POST':
            for f, t in request.POST.items():
                TagTranslation.create_translation(f, t)

            if request.is_ajax():
                return HttpResponse(json.dumps({'success': True}))

        kwargs = {"%s__isnull" % to_lang: False}
        translated = [
            t[lang]
            for t in TagTranslation.objects.filter(**kwargs).values(lang)
        ]
        ctx['items'] = Tag.objects.all().exclude(
            name__in=translated).order_by('weight')
        ctx['lang'] = lang
        ctx['to_lang'] = to_lang

        return render(request, 'moderation/tag_translation/list.html', ctx)
    def get_view( self, request ):
        moderated_items = registry.get_by_user( request.user )

        ctx = {
            "moderated_item": registry.get_by_name( self.name ),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        if request.method == 'POST':
            ctx['form'] = TagTranslationForm( request.POST )
            if ctx['form'].is_valid():
                cleaned_data = ctx['form'].cleaned_data
                
                f = cleaned_data['f']
                t = cleaned_data['t']

                TagTranslation.create_translation( f, t )

                messages.add_message( request, messages.INFO, _( "Tag translated!" ) )
                return redirect( self.get_absolute_url() )

        else: 
            ctx['form'] = TagTranslationForm()

        return render( request, 'moderation/tag_translation/create.html', ctx )
Exemple #6
0
    def get_view( self, request ):
        moderated_items = registry.get_by_user( request.user )

        ctx = {
            "moderated_item": registry.get_by_name( self.name ),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        if request.method == 'POST':
            ctx['form'] = TagCreateAliasForm( request.POST )
            if ctx['form'].is_valid():
                cleaned_data = ctx['form'].cleaned_data
                
                tag = cleaned_data['tag']
                aliases = cleaned_data['aliases']

                already_added = TagAlias.objects.filter( tag=tag )
                for added in already_added:
                    if added.name in aliases:
                        aliases.remove( added.name )
                    else:
                        added.delete()
               
                for alias in aliases:
                    TagAlias.objects.create( tag=tag, name=alias )
                
                messages.add_message( request, messages.INFO, _( "Alias created!" ) )
                return redirect( self.get_absolute_url() )

        else: 
            ctx['form'] = TagCreateAliasForm()

        return render( request, 'moderation/tag_aliases/create.html', ctx )
Exemple #7
0
def moderate_item( request, model ):
    moderated_item = registry.get_by_name( model )
    if moderated_item is None:
        raise Http404

    if request.user.has_perm( moderated_item.permission ):
        if isinstance( moderated_item, ModeratorTool ):
            return moderated_item.get_view( request )

        template = "moderation/index.html"
        moderated_items = registry.get_by_user( request.user )
        args = {
            "moderated_item": moderated_item,
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools'],
        }
        if request.method == 'POST':
            try:
                if 'reject' in request.POST and not 'confirmed' in request.POST:
                    item_id = request.POST.get( 'id', None )
                    if item_id is None:
                        raise ModerationException( "Unknown item ..." )

                    template = "moderation/reject.html"
                    args['form'] = RejectForm()
                    args['item'] = moderated_item.get_by_pk( int( item_id ) )

                else:
                    process_action( request, moderated_item )

            except ModerationException, e:
                request.user.message_set.create( message=str( e ) )

        return render_to_response( template, args, context_instance=RequestContext( request ) )
Exemple #8
0
def film_merging( request ):
    items = DuplicateFilm.objects.filter( resolved=False )
    moderated_items = registry.get_by_user( request.user )

    return render( request, "moderation/merging_tools/movies/index.html", { 
        "items": items,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    })
Exemple #9
0
def film_merging(request):
    items = DuplicateFilm.objects.filter(resolved=False)
    moderated_items = registry.get_by_user(request.user)

    return render(
        request, "moderation/merging_tools/movies/index.html", {
            "items": items,
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools'],
        })
 def get_context_data( self, *args, **kwargs ):
     context = super( ModerationEditFeaturesView, self ).get_context_data( *args, **kwargs )
     moderated_items = registry.get_by_user( self.request.user )
     context.update({
         "all"            : self.request.method == 'GET' and self.request.GET.get( 'all', False ),
         "tag"            : self.request.method == 'GET' and self.request.GET.get( 'tag', '' ),
         "moderated_item" : registry.get_by_name( "film-features" ),
         "moderated_items": moderated_items['items'],
         "moderator_tools": moderated_items['tools'],
         "from_moderation": True,
     })
     return context
Exemple #11
0
    def get_view(self, request):
        moderated_items = registry.get_by_user(request.user)

        ctx = {
            "moderated_item": registry.get_by_name(self.name),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        if request.method == 'POST':
            ctx['form'] = TagRenameForm(request.POST)
            if ctx['form'].is_valid():
                cleaned_data = ctx['form'].cleaned_data

                tag_a_name = cleaned_data['tagA']
                tag_a_tag = Tag.objects.get(name=tag_a_name)
                tag_a_count = self._get_tagged_objects_count(tag_a_tag)

                tag_b_name = cleaned_data['tagB']
                tag_b_tag = None
                try:
                    tag_b_tag = Tag.objects.get(name=tag_b_name)
                except Tag.DoesNotExist:
                    pass
                tag_b_count = self._get_tagged_objects_count(
                    tag_b_tag) if tag_b_tag else 0

                if not 'confirm' in request.POST:
                    ctx['to_confirm'] = {
                        'tagA': {
                            'name': tag_a_name,
                            'count': tag_a_count,
                        },
                        'tagB': {
                            'name': tag_b_name,
                            'count': tag_b_count,
                        }
                    }

                else:

                    rename_tag.delay(tag_a_name, tag_b_name, request.user)

                    messages.add_message(
                        request, messages.INFO,
                        _("your task will be executed in the background, you will be informed when it's finished"
                          ))
                    return redirect(self.get_absolute_url())

        else:
            ctx['form'] = TagRenameForm()

        return render(request, 'moderation/rename_tag/create.html', ctx)
    def get_view( self, request ):
        moderated_items = registry.get_by_user( request.user )

        ctx = {
            "moderated_item": registry.get_by_name( self.name ),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        if request.method == 'POST':
            ctx['form'] = TagRenameForm( request.POST )
            if ctx['form'].is_valid():
                cleaned_data = ctx['form'].cleaned_data
                
                tag_a_name = cleaned_data['tagA']
                tag_a_tag = Tag.objects.get( name=tag_a_name )
                tag_a_count = self._get_tagged_objects_count( tag_a_tag )
                
                tag_b_name = cleaned_data['tagB']
                tag_b_tag = None
                try:
                    tag_b_tag = Tag.objects.get( name=tag_b_name )
                except Tag.DoesNotExist:
                    pass
                tag_b_count = self._get_tagged_objects_count( tag_b_tag ) if tag_b_tag else 0

                if not 'confirm' in request.POST:
                    ctx['to_confirm'] = {
                        'tagA': {
                            'name' : tag_a_name,
                            'count': tag_a_count,
                        },
                        'tagB': {
                            'name' : tag_b_name,
                            'count': tag_b_count,
                        }
                    }

                else:
                    
                    rename_tag.delay( tag_a_name, tag_b_name, request.user )
                    
                    messages.add_message( request, messages.INFO, _( "your task will be executed in the background, you will be informed when it's finished" ) )
                    return redirect( self.get_absolute_url() )

        else: 
            ctx['form'] = TagRenameForm()

        return render( request, 'moderation/rename_tag/create.html', ctx )
Exemple #13
0
def index( request ):
    
    moderated_items = registry.get_by_user( request.user )

    first_with_items = None
    for moderated_item in moderated_items['items']:
        if first_with_items is None and moderated_item.get_not_moderated().count() > 0:
            first_with_items = moderated_item
            break

    if first_with_items is None:
        first_with_items = moderated_items['items'][0] if len( moderated_items['items'] ) > 0 else None

    return render_to_response( "moderation/index.html", {
        "moderated_item": first_with_items,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    }, context_instance=RequestContext( request ) )
Exemple #14
0
 def get_context_data(self, *args, **kwargs):
     context = super(ModerationEditFeaturesView,
                     self).get_context_data(*args, **kwargs)
     moderated_items = registry.get_by_user(self.request.user)
     context.update({
         "all":
         self.request.method == 'GET'
         and self.request.GET.get('all', False),
         "tag":
         self.request.method == 'GET' and self.request.GET.get('tag', ''),
         "moderated_item":
         registry.get_by_name("film-features"),
         "moderated_items":
         moderated_items['items'],
         "moderator_tools":
         moderated_items['tools'],
         "from_moderation":
         True,
     })
     return context
Exemple #15
0
def people_merging_resolve(request, id):
    dp = get_object_or_404(DuplicatePerson, pk=id)
    step = int(request.POST.get('step', 1))

    moderated_items = registry.get_by_user(request.user)
    ctx = {
        "step": step,
        "duplicate_person": dp,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    }

    if step > 1:
        if 'A' in request.POST:
            option = 'A'
            selected = dp.personA
            to_delete = dp.personB

        else:
            option = 'B'
            selected = dp.personB
            to_delete = dp.personA

        ctx['option'] = option
        ctx['selected'] = selected
        ctx['to_delete'] = to_delete

        if step in [2, 3]:
            save = (step == 3)

            preview = Preview(request, item_formater) if not save else None

            do_people_merging_resolve(selected, to_delete, preview)

            if not save:
                ctx['preview'] = preview
                ctx['objects_to_delete'] = get_related_objects([to_delete])

    return render(
        request, "moderation/merging_tools/people/resolve-step-%d.html" % step,
        ctx)
Exemple #16
0
def index(request):

    moderated_items = registry.get_by_user(request.user)

    first_with_items = None
    for moderated_item in moderated_items['items']:
        if first_with_items is None and moderated_item.get_not_moderated(
        ).count() > 0:
            first_with_items = moderated_item
            break

    if first_with_items is None:
        first_with_items = moderated_items['items'][0] if len(
            moderated_items['items']) > 0 else None

    return render_to_response("moderation/index.html", {
        "moderated_item": first_with_items,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    },
                              context_instance=RequestContext(request))
Exemple #17
0
def people_merging_resolve( request, id ):
    dp = get_object_or_404( DuplicatePerson, pk=id )
    step = int( request.POST.get( 'step', 1 ) )

    moderated_items = registry.get_by_user( request.user )
    ctx = {
        "step": step,
        "duplicate_person": dp,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    }

    if step > 1:
        if 'A' in request.POST:
            option    = 'A'
            selected  = dp.personA
            to_delete = dp.personB

        else:
            option    = 'B'
            selected  = dp.personB
            to_delete = dp.personA

        ctx['option']    = option
        ctx['selected']  = selected
        ctx['to_delete'] = to_delete

        if step in [2, 3]:
            save = ( step == 3 )

            preview = Preview( request, item_formater ) if not save else None

            do_people_merging_resolve( selected, to_delete, preview )

            if not save:
                ctx['preview'] = preview
                ctx['objects_to_delete'] = get_related_objects( [to_delete] )

    return render( request, "moderation/merging_tools/people/resolve-step-%d.html" % step, ctx )
Exemple #18
0
def moderate_item(request, model):
    moderated_item = registry.get_by_name(model)
    if moderated_item is None:
        raise Http404

    if request.user.has_perm(moderated_item.permission):
        if isinstance(moderated_item, ModeratorTool):
            return moderated_item.get_view(request)

        template = "moderation/index.html"
        moderated_items = registry.get_by_user(request.user)
        args = {
            "moderated_item": moderated_item,
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools'],
        }
        if request.method == 'POST':
            try:
                if 'reject' in request.POST and not 'confirmed' in request.POST:
                    item_id = request.POST.get('id', None)
                    if item_id is None:
                        raise ModerationException("Unknown item ...")

                    template = "moderation/reject.html"
                    args['form'] = RejectForm()
                    args['item'] = moderated_item.get_by_pk(int(item_id))

                else:
                    process_action(request, moderated_item)

            except ModerationException, e:
                request.user.message_set.create(message=str(e))

        return render_to_response(template,
                                  args,
                                  context_instance=RequestContext(request))
Exemple #19
0
    def get_view( self, request ):
        moderated_items = registry.get_by_user( request.user )

        ctx = {
            "moderated_item": registry.get_by_name( self.name ),
            "moderated_items": moderated_items['items'],
            "moderator_tools": moderated_items['tools']
        }

        if request.method == 'POST':
            ctx['form'] = TagRenameForm( request.POST )
            if ctx['form'].is_valid():
                cleaned_data = ctx['form'].cleaned_data
                
                tag_a_name = cleaned_data['tagA']
                tag_a_tag = Tag.objects.get( name=tag_a_name )
                tag_a_count = self._get_tagged_objects_count( tag_a_tag )
                
                tag_b_name = cleaned_data['tagB']
                tag_b_tag = None
                try:
                    tag_b_tag = Tag.objects.get( name=tag_b_name )
                except Tag.DoesNotExist:
                    pass
                tag_b_count = self._get_tagged_objects_count( tag_b_tag ) if tag_b_tag else 0

                if not 'confirm' in request.POST:
                    ctx['to_confirm'] = {
                        'tagA': {
                            'name' : tag_a_name,
                            'count': tag_a_count,
                        },
                        'tagB': {
                            'name' : tag_b_name,
                            'count': tag_b_count,
                        }
                    }

                else:
                    
                    with transaction.commit_on_success():
                        # create tag b if not exists
                        if tag_b_tag is None:
                            tag_b_tag = Tag.objects.create( name=tag_b_name )
     
                        # replace tags
                        for obj in TaggedItem.objects.filter( tag=tag_a_tag ):
                            # if objects is already tagged with tag 'a' 
                            #   we must remove this relation
                            try:
                                ti = TaggedItem.objects.get( tag=tag_b_tag, content_type=obj.content_type, object_id=obj.object_id )
                                ti.delete()

                            except TaggedItem.DoesNotExist:
                                pass

                            obj.tag = tag_b_tag
                            obj.save()
                            
                            # update object localized tag_list
                            if isinstance( obj.object, ObjectLocalized ):
                                obj.object.tag_list = ', '.join( [ tag.name for tag in Tag.objects.get_for_object( obj.object ) ] )
                                obj.object.save()

                        # remove tag a
                        tag_a_tag.delete()
                        
                    messages.add_message( request, messages.INFO, _( "Tag renamed!" ) )
                    return redirect( self.get_absolute_url() )

        else: 
            ctx['form'] = TagRenameForm()

        return render( request, 'moderation/rename_tag/create.html', ctx )
Exemple #20
0
def film_merging_resolve(request, id):
    dp = get_object_or_404(DuplicateFilm, pk=id)
    step = int(request.POST.get('step', 1))

    moderated_items = registry.get_by_user(request.user)
    ctx = {
        "step": step,
        "duplicate_film": dp,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    }

    if step == 1:
        ctx['stats'] = {
            'number_of_ratings': {
                'A': Rating.objects.filter(film=dp.filmA).count(),
                'B': Rating.objects.filter(film=dp.filmB).count(),
            },
            'number_of_activities': {
                'A': UserActivity.all_objects.filter(film=dp.filmA).count(),
                'B': UserActivity.all_objects.filter(film=dp.filmB).count(),
            }
        }

    elif step > 1:
        if 'A' in request.POST:
            option = 'A'
            selected = dp.filmA
            to_delete = dp.filmB

        else:
            option = 'B'
            selected = dp.filmB
            to_delete = dp.filmA

        ctx['option'] = option
        ctx['selected'] = selected
        ctx['to_delete'] = to_delete

        if step in [2, 3]:
            save = (step == 3)

            if not save:
                preview = Preview(request, item_formater)

            with transaction.commit_on_success():
                has_photo = selected.image or selected.hires_image

                # 1. update tags
                tags = {'en': [], 'pl': []}

                for lang in ('en', 'pl'):
                    for flm in (to_delete, selected):
                        try:
                            film_localized = ObjectLocalized.objects.get(
                                parent=flm.id, LANG=lang)
                            for tag in Tag.objects.get_for_object(
                                    film_localized):
                                if not tag.name in tags[lang]:
                                    tags[lang].append(tag.name)

                        except ObjectLocalized.DoesNotExist:
                            pass

                for lang in ('en', 'pl'):
                    if len(tags[lang]):
                        tag_list = ", ".join(tags[lang])
                        if save:
                            selected.save_tags(tag_list, lang)
                        else:
                            preview.add_item(
                                _('Merged tags'),
                                "<strong>%s</strong>: %s" % (lang, tag_list),
                                "")

                # 2. update wishlist and owned
                for bi in BasketItem.objects.filter(film=to_delete):
                    try:
                        BasketItem.objects.get(film=selected, user=bi.user)

                    except BasketItem.DoesNotExist:
                        if save:
                            bi.film = selected
                            bi.save()

                        else:
                            preview.add_item(_('Basket item to update'), bi,
                                             "")

                # 3. merge all activities reloated to that film
                for ua in UserActivity.all_objects.filter(film=to_delete):

                    # remove deleted object photo activity if selected film already has
                    if has_photo and ua.activity_type == UserActivity.TYPE_POSTER:
                        if save:
                            ua.delete()

                        else:
                            preview.add_item(
                                _('UserActivity to remove'), ua,
                                _("will be removed because the film already has image"
                                  ))
                        continue

                    if save:
                        # film wallpost
                        if ua.activity_type == UserActivity.TYPE_SHORT_REVIEW:
                            ua.object = selected
                            ua.watching_object = selected
                            ua.title = str(selected)

                        ua.film = selected
                        ua.film_title = selected.get_title()
                        ua.film_slug = selected.permalink
                        ua.save()

                    else:
                        preview.add_item(
                            _('UserActivity to update'), ua,
                            _("will be updated to point to a selected film"))

                # 3. merge film photo
                if not has_photo and (to_delete.hires_image
                                      or to_delete.image):
                    if save:
                        selected.image = to_delete.image
                        selected.hires_image = to_delete.hires_image
                    else:
                        preview.add_item(
                            _('Photo to replace'), to_delete.hires_image
                            or to_delete.image,
                            _("the image will be taken from object to delete"))

                # 4. update all the ratings of this film
                for rating in Rating.objects.filter(film=to_delete,
                                                    rating__isnull=False):
                    try:
                        selected_rating = Rating.objects.get(film=selected,
                                                             type=rating.type,
                                                             user=rating.user)
                        if save:
                            rating_helper.rate(rating.user,
                                               None,
                                               film_id=to_delete.id,
                                               type=rating.type)
                        else:
                            preview.add_item(
                                'Film rating to delete', rating,
                                _("the film rating to delete - user rated both films"
                                  ))

                    except Rating.DoesNotExist:
                        if save:
                            rating_helper.rate(rating.user,
                                               rating.rating,
                                               film_id=selected.id,
                                               type=rating.type)
                            rating_helper.rate(rating.user,
                                               None,
                                               film_id=to_delete.id,
                                               type=rating.type)
                        else:
                            preview.add_item('Film rating to update', rating,
                                             _("the film rating to update"))

                # 5. short reviews
                for review in ShortReview.all_objects.filter(
                        object__pk=to_delete.pk):
                    if save:
                        review.object = selected
                        review.save()

                    else:
                        preview.add_item(
                            'Short Review to update', review,
                            _("the related object of this short review will be updated"
                              ))

                # 6. articles
                for post in Post.objects.filter(related_film__pk=to_delete.pk):
                    if save:
                        post.related_film.remove(to_delete)
                        post.related_film.add(selected)
                        post.save()

                    else:
                        preview.add_item(
                            'Article to update', post,
                            _("the related film of this article will be updated"
                              ))

                # 7. showtimes
                for foch in FilmOnChannel.objects.filter(film=to_delete):
                    if save:
                        foch.film = selected
                        foch.save()

                    else:
                        preview.add_item('Film on channel to update', foch, "")

                for checkin in ScreeningCheckIn.objects.filter(film=to_delete):
                    if save:
                        checkin.film = selected
                        checkin.save()

                    else:
                        preview.add_item('Checkin to update', checkin, "")

                # 8. delete object
                if save:
                    to_delete.delete()
                    selected.save()

                else:
                    ctx['preview'] = preview
                    ctx['objects_to_delete'] = get_related_objects([to_delete])

    return render(
        request, "moderation/merging_tools/movies/resolve-step-%d.html" % step,
        ctx)
Exemple #21
0
def film_merging_resolve( request, id ):
    dp = get_object_or_404( DuplicateFilm, pk=id )
    step = int( request.POST.get( 'step', 1 ) )

    moderated_items = registry.get_by_user( request.user )
    ctx = {
        "step": step,
        "duplicate_film": dp,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    }

    if step == 1:
        ctx['stats'] = {
            'number_of_ratings': {
                'A': Rating.objects.filter( film=dp.filmA ).count(),
                'B': Rating.objects.filter( film=dp.filmB ).count(),
            },
            'number_of_activities': {
                'A': UserActivity.all_objects.filter( film=dp.filmA ).count(),
                'B': UserActivity.all_objects.filter( film=dp.filmB ).count(),
            }
        }

    elif step > 1:
        if 'A' in request.POST:
            option    = 'A'
            selected  = dp.filmA
            to_delete = dp.filmB

        else:
            option    = 'B'
            selected  = dp.filmB
            to_delete = dp.filmA

        ctx['option']    = option
        ctx['selected']  = selected
        ctx['to_delete'] = to_delete

        if step in [2, 3]:
            save = ( step == 3 )

            if not save:
                preview = Preview( request, item_formater )

            with transaction.commit_on_success():
                has_photo = selected.image or selected.hires_image

                # 1. update tags
                tags = { 
                    'en': [],
                    'pl': [] 
                }

                for lang in ( 'en', 'pl' ):
                    for flm in ( to_delete, selected ):
                        try:
                            film_localized = ObjectLocalized.objects.get( parent=flm.id, LANG=lang )
                            for tag in Tag.objects.get_for_object( film_localized ):
                                if not tag.name in tags[lang]:
                                    tags[lang].append( tag.name )

                        except ObjectLocalized.DoesNotExist: 
                            pass

                for lang in ( 'en', 'pl' ):
                    if len( tags[lang] ):
                        tag_list = ", ". join( tags[lang] )
                        if save:
                            selected.save_tags( tag_list, lang )
                        else:
                            preview.add_item( _( 'Merged tags' ), "<strong>%s</strong>: %s" % ( lang, tag_list ), "" )
            

                # 2. update wishlist and owned 
                for bi in BasketItem.objects.filter( film=to_delete ):
                    try:
                        BasketItem.objects.get( film=selected, user=bi.user )

                    except BasketItem.DoesNotExist: 
                        if save:
                            bi.film = selected
                            bi.save()

                        else:
                            preview.add_item( _( 'Basket item to update' ), bi, "" )

               
                # 3. merge all activities reloated to that film
                for ua in UserActivity.all_objects.filter( film=to_delete ):

                    # remove deleted object photo activity if selected film already has
                    if has_photo and ua.activity_type == UserActivity.TYPE_POSTER:
                        if save:
                            ua.delete()

                        else:
                            preview.add_item( _( 'UserActivity to remove' ), ua,
                                                _( "will be removed because the film already has image" ) )
                        continue
                     
                    if save:
                        # film wallpost 
                        if ua.activity_type == UserActivity.TYPE_SHORT_REVIEW:
                            ua.object = selected
                            ua.watching_object = selected
                            ua.title = str( selected )
 
                        ua.film = selected
                        ua.film_title = selected.get_title();
                        ua.film_slug = selected.permalink
                        ua.save()

                    else:
                        preview.add_item( _( 'UserActivity to update' ), ua, _( "will be updated to point to a selected film" ) )

                # 3. merge film photo
                if not has_photo and ( to_delete.hires_image or to_delete.image ):
                    if save:
                        selected.image = to_delete.image
                        selected.hires_image = to_delete.hires_image
                    else:
                        preview.add_item( _( 'Photo to replace' ), to_delete.hires_image or to_delete.image
                                            , _( "the image will be taken from object to delete" ) )

                # 4. update all the ratings of this film
                for rating in Rating.objects.filter( film=to_delete, rating__isnull=False ):
                    try:
                        selected_rating = Rating.objects.get( film=selected, type=rating.type, user=rating.user )
                        if save:
                            rating_helper.rate(rating.user, None, film_id=to_delete.id, type=rating.type)
                        else:
                            preview.add_item( 'Film rating to delete', rating, _( "the film rating to delete - user rated both films" ) )

                    except Rating.DoesNotExist:
                        if save:
                            rating_helper.rate(rating.user, rating.rating, film_id=selected.id, type=rating.type)
                            rating_helper.rate(rating.user, None, film_id=to_delete.id, type=rating.type)
                        else:
                            preview.add_item( 'Film rating to update', rating, _( "the film rating to update" ) )

                # 5. short reviews
                for review in ShortReview.all_objects.filter( object__pk=to_delete.pk ):
                    if save:
                        review.object=selected
                        review.save()

                    else:
                        preview.add_item( 'Short Review to update', review, _( "the related object of this short review will be updated" ) )


                # 6. articles
                for post in Post.objects.filter( related_film__pk=to_delete.pk ):
                    if save:
                        post.related_film.remove( to_delete )
                        post.related_film.add( selected )
                        post.save()

                    else:
                        preview.add_item( 'Article to update', post, _( "the related film of this article will be updated" ) )

                # 7. showtimes
                for foch in FilmOnChannel.objects.filter( film=to_delete ):
                    if save:
                        foch.film = selected
                        foch.save()

                    else:
                        preview.add_item( 'Film on channel to update', foch, "" )

                for checkin in ScreeningCheckIn.objects.filter( film=to_delete ):
                    if save:
                        checkin.film = selected
                        checkin.save()

                    else:
                        preview.add_item( 'Checkin to update', checkin, "" )


                # 8. delete object
                if save:
                    to_delete.delete()
                    selected.save()

                else:
                    ctx['preview'] = preview
                    ctx['objects_to_delete'] = get_related_objects( [to_delete] )

    return render( request, "moderation/merging_tools/movies/resolve-step-%d.html" % step, ctx )
Exemple #22
0
def people_merging_resolve( request, id ):
    dp = get_object_or_404( DuplicatePerson, pk=id )
    step = int( request.POST.get( 'step', 1 ) )

    moderated_items = registry.get_by_user( request.user )
    ctx = {
        "step": step,
        "duplicate_person": dp,
        "moderated_items": moderated_items['items'],
        "moderator_tools": moderated_items['tools'],
    }

    if step > 1:
        if 'A' in request.POST:
            option    = 'A'
            selected  = dp.personA
            to_delete = dp.personB

        else:
            option    = 'B'
            selected  = dp.personB
            to_delete = dp.personA

        ctx['option']    = option
        ctx['selected']  = selected
        ctx['to_delete'] = to_delete

        if step in [2, 3]:
            save = ( step == 3 )

            if not save:
                preview = Preview( request, item_formater )

            with transaction.commit_on_success():
                has_photo = selected.image or selected.hires_image
                
                # 1. merge all activities reloated to that person
                for ua in UserActivity.all_objects.filter( person=to_delete ):

                    # remove deleted object photo activity if selected person already has
                    if has_photo and ua.activity_type == UserActivity.TYPE_POSTER:
                        if save:
                            ua.delete()

                        else:
                            preview.add_item( _( 'UserActivity to remove' ), ua,
                                                _( "will be removed becouse person already has image" ) )
                        continue
                    
                    # update poster related fields
                    if ua.activity_type == UserActivity.TYPE_POSTER:
                        if save:
                            ua.object_title = str( selected );
                            ua.object_slug = selected.permalink
                    
                    # person wallpost 
                    elif ua.activity_type == UserActivity.TYPE_SHORT_REVIEW:
                        if save:
                            ua.object = selected
                            ua.watching_object = selected
                            ua.title = str( selected )
                   
                    if save:
                        ua.person = selected
                        ua.save()
                    else:
                        preview.add_item( _( 'UserActivity to update' ), ua, _( "will be updated to point selected person" ) )

                # 2. merge person photo
                if not has_photo and ( to_delete.hires_image or to_delete.image ):
                    if save:
                        selected.image = to_delete.image
                        selected.hires_image = to_delete.hires_image
                    else:
                        preview.add_item( _( 'Photo to replace' ), to_delete.hires_image or to_delete.image
                                            , _( "the image will be taken from object to delete" ) )

                # 3. update links to that person in all the films he's eiter acting or directing
                for character in Character.objects.filter( person=to_delete ):
                    if save:
                        character.person = selected
                        character.save()
                    else:
                        preview.add_item( 'Character to replace', character, _( "this characters will be updated" ) )

                # ordering ???
                for film in Film.objects.filter( directors__in=[to_delete] ):
                    if save:
                        film.directors.remove( to_delete )
                        film.directors.add( selected )
                        film.save()

                    else:
                        preview.add_item( 'Director to replace', film, _( "the director of this movies will be updated" ) )

                # 4. update all the ratings of this person
                for rating in Rating.objects.filter( director=to_delete ):
                    if save:
                        rating.director = selected
                        rating.save()

                    else:
                        preview.add_item( 'Director rating to update', rating, _( "the director rating to update" ) )
                        

                for rating in Rating.objects.filter( actor=to_delete ):
                    if save:
                        rating.actor = selected
                        rating.save()

                    else:
                        preview.add_item( 'Actor rating to update', rating, _( "the actor rating to update" ) )

                # 5. short reviews
                for review in ShortReview.all_objects.filter( object__pk=to_delete.pk ):
                    if save:
                        review.object=selected
                        review.save()

                    else:
                        preview.add_item( 'Short Review to update', review, _( "the related object of this short review will be updated" ) )


                # 6. articles
                for post in Post.objects.filter( related_person__pk=to_delete.pk ):
                    if save:
                        post.related_person.remove( to_delete )
                        post.related_person.add( selected )
                        post.save()

                    else:
                        preview.add_item( 'Article to update', post, _( "the related person of this article will be updated" ) )

                # 7. delete object
                if save:
                    to_delete.delete()
                    selected.save()

                else:
                    ctx['preview'] = preview
                    ctx['objects_to_delete'] = get_related_objects( [to_delete] )


    return render( request, "moderation/merging_tools/people/resolve-step-%d.html" % step, ctx )