示例#1
0
    def create(self, validated_data):
        request = self.context["request"]
        # Note that DRF requires us to use the source as the key here but
        # tags prior to serializing
        mission = None
        tags = validated_data.pop('get_tags', [])
        owner = Pleb.get(request.user.username)
        mission_id = validated_data.get('mission', '')
        if mission_id:
            mission = Mission.get(mission_id)
        validated_data['owner_username'] = owner.username
        uuid = str(uuid1())
        validated_data['content'] = render_content(
            validated_data.get('content', ""))
        url = reverse('question_detail_page',
                      kwargs={
                          'question_uuid': uuid,
                          "slug": slugify(validated_data['title'])
                      },
                      request=request)
        href = reverse('question-detail',
                       kwargs={'object_uuid': uuid},
                       request=request)
        soup = BeautifulSoup(validated_data['content'], "lxml").get_text()
        question = Question(url=url,
                            href=href,
                            object_uuid=uuid,
                            summary=smart_truncate(soup),
                            **validated_data).save()
        question.owned_by.connect(owner)
        if mission is not None:
            mission.associated_with.connect(question)
        for tag in tags:
            query = 'MATCH (t:Tag {name:"%s"}) WHERE NOT t:AutoTag ' \
                    'RETURN t' % slugify(tag)
            res, _ = db.cypher_query(query)
            if not res.one:
                if (request.user.username == "devon_bleibtrey"
                        or request.user.username == "tyler_wiersing"
                        or owner.reputation >= 1250):
                    tag_obj = Tag(name=slugify(tag)).save()
                    question.tags.connect(tag_obj)
                else:
                    continue
            else:
                tag_obj = Tag.inflate(res.one)
                question.tags.connect(tag_obj)

        spawn_task(task_func=update_tags, task_param={"tags": tags})
        if validated_data.get('external_location_id', None) is not None:
            spawn_task(
                task_func=create_location_tree,
                task_param={"external_id": question.external_location_id})
        spawn_task(task_func=add_auto_tags_to_question_task,
                   task_param={"object_uuid": question.object_uuid})
        spawn_task(task_func=create_question_summary_task,
                   task_param={'object_uuid': question.object_uuid})
        question.refresh()
        cache.set(question.object_uuid, question)
        return question
示例#2
0
 def get_focused_on(self, request=None):
     from api.neo_models import SBObject
     from sb_quests.neo_models import Position
     from sb_quests.serializers import PositionSerializer
     from sb_tags.neo_models import Tag
     from sb_tags.serializers import TagSerializer
     from sb_questions.neo_models import Question
     from sb_questions.serializers import QuestionSerializerNeo
     query = 'MATCH (a:Mission {object_uuid: "%s"})-[:FOCUSED_ON]->(b)' \
             'RETURN b' % self.object_uuid
     res, _ = db.cypher_query(query)
     if res.one:
         child_label = SBObject.inflate(res.one).get_child_label()
         if child_label == "Position":
             return PositionSerializer(Position.inflate(res.one),
                                       context={
                                           'request': request
                                       }).data
         elif child_label == "Tag":
             return TagSerializer(Tag.inflate(res.one),
                                  context={
                                      'request': request
                                  }).data
         elif child_label == "Question":
             return QuestionSerializerNeo(Question.inflate(res.one),
                                          context={
                                              'request': request
                                          }).data
     else:
         return None
示例#3
0
 def create(self, validated_data):
     from sb_tags.neo_models import Tag
     from sb_tags.serializers import TagSerializer
     request, _, _, _, _ = gather_request_data(self.context)
     generated_tags = []
     if request is None:
         raise serializers.ValidationError(
             "Must perform creation from web request")
     for tag in validated_data['interests']:
         try:
             query = 'MATCH (profile:Pleb {username: "******"}), ' \
                     '(tag:Tag {name: "%s"}) ' \
                     'CREATE UNIQUE (profile)-[:INTERESTED_IN]->(tag) ' \
                     'RETURN tag' % (request.user.username, slugify(tag))
             res, _ = db.cypher_query(query)
             generated_tags.append(TagSerializer(Tag.inflate(res.one)).data)
         except(ConstraintViolation, Exception):
             pass
     cache.delete(request.user.username)
     return generated_tags
示例#4
0
def limit_offset_query(skip, limit):
    query = 'MATCH (tag:Tag) WHERE NOT tag:AutoTag ' \
            'RETURN tag SKIP %s LIMIT %s' % (skip, limit)
    res, _ = db.cypher_query(query)
    return [Tag.inflate(row[0]) for row in res]