Exemplo n.º 1
0
 def related_objects(self, related_model, related_fields, objs):
     """
     Get a QuerySet of the related model to objs via related fields.
     """
     predicate = reduce(
         operator.or_,
         (query_utils.Q(**{'%s__in' % related_field.name: objs})
          for related_field in related_fields))
     return related_model._base_manager.using(self.using).filter(predicate)
Exemplo n.º 2
0
 def get_context_data(self, **kwargs):
     game = self.object
     kwargs['catalog_page'] = get_game_page(game)
     roles = stories.Role.objects.filter(
         variation=game.variation,
         show_in_character_list=True).exclude(deleted=True)
     for role in roles:
         if role_text_read_right(role, self.request.user, game):
             role.text_url = urls.reverse('games:view_role',
                                          args=(role.pk, ))
     kwargs['roles'] = roles
     kwargs['authors'] = stories.StoryAuthor.objects.filter(
         story=game.variation.story)
     kwargs['materials'] = stories.AdditionalMaterial.objects.filter(
         (query_utils.Q(variation=game.variation)
          | query_utils.Q(story=game.variation.story))
         & query_utils.Q(admins_only=False))
     return super(GameView, self).get_context_data(**kwargs)
Exemplo n.º 3
0
 def related_objects(self, related_model, related_fields, objs):
     """
     Get a QuerySet of the related model to objs via related fields.
     """
     predicate = query_utils.Q(
         *((f"{related_field.name}__in", objs)
           for related_field in related_fields),
         _connector=query_utils.Q.OR,
     )
     return related_model._base_manager.using(self.using).filter(predicate)
Exemplo n.º 4
0
    def related_objects(self, related_model, related_fields, objs):
        """Custom `related_objects` method.

        This method uses `_default_manager` instead of `_base_manager`.

        """
        predicate = reduce(operator.or_, (
            query_utils.Q(**{'%s__in' % related_field.name: objs})
            for related_field in related_fields
        ))
        return related_model._default_manager.using(self.using).filter(
            predicate
        )
Exemplo n.º 5
0
    def get_context_data(self, **kwargs):
        self.obj = self.variation
        if not self.check_rights():
            raise exceptions.PermissionDenied()
        admin = (not self.obj.game) or self.obj.game.edit_right(self.user)
        all_roles = list(stories_models.Role.objects.filter(
            variation=self.obj, deleted=False))
        roles_list = []
        if self.obj.game:
            if self.obj.game.edit_right(self.user):
                roles_list = all_roles.copy()
            elif self.obj.game.status >= game_models.GAME_STATUS_FINISHING:
                roles_list = [
                    role for role in all_roles if role.show_in_character_list]
            elif self.user.is_authenticated:
                roles_list = [
                    role for role in all_roles if role.user_id == self.user.id]
        if admin:
            character_list = all_roles.copy()
        else:
            character_list = [
                r for r in all_roles
                if r.show_in_character_list or r in roles_list]

        if not self.user.is_anonymous:
            self.process_trust_marks(character_list)

        query = query_utils.Q(variation=self.obj) | query_utils.Q(
            story_id=self.obj.story_id, variation=None)
        if not admin:
            query = query & query_utils.Q(admins_only=False)
        materials = stories_models.AdditionalMaterial.objects.filter(query)
        illustrations = stories_models.Illustration.objects.filter(query)
        if (not self.variation.thread) and self.user.is_authenticated:
            with transaction.atomic():
                variation = stories_models.Variation.objects.select_for_update(
                    ).get(pk=self.variation.pk)
                self.obj.thread = variation.thread = core.create_game_forum(
                    self.user, variation)
                variation.save()
        return {
            'id': self.obj.id,
            'url': urls.reverse(
                'game_forum_api:variation',
                kwargs={'variation_id': self.variation.id}),
            'game':
                self.game_to_json(self.obj.game) if self.obj.game_id else None,
            'thread_id': self.obj.thread_id,
            'write_right': (
                (not self.obj.game) or self.obj.game.write_right(self.user)),
            'characters': [{
                'id': role.id,
                'title': html.escape(role.name),
                'avatar': role.avatar.image.url if role.avatar else None,
                'comments_count': role.comments_count,
                'trust_value': role.trust_value,
                'my_trust': getattr(role, 'my_trust', None),
                'description': role.description,
            } for role in character_list],
            'roles': [{
                'id': role.id,
                'title': html.escape(role.name),
                'avatar': role.avatar.image.url if role.avatar else None,
                'comments_count': role.comments_count,
                'assigned': role.user_id == self.user.pk,
            } for role in roles_list],
            'materials': [{
                'id': m.id,
                'url': m.url(),
                'title': html.escape(m.name),
            } for m in materials],
            'illustrations': [{
                'id': m.id,
                'title': m.name,
                'url': m.image.url if m.image else None,
                'thumb': m.thumb.url if m.thumb else None,
            } for m in illustrations],
        }