示例#1
0
 def test_tags_are_unique_per_project(self):
     tag_text = "please_don't_duplicate_me"
     t0 = Tag(tag_text=tag_text, project=Project.objects.get(name_short=p0_short))
     t0.save()
     with self.assertRaises(IntegrityError):
         t1 = Tag(tag_text=tag_text, project=Project.objects.get(name_short=p0_short))
         t1.save()
示例#2
0
 def test_delete_all(self):
     tags = ['tag0_project0', 'tag0_project1', 'tag0_project2', 'tag0_project3']
     tag0 = Tag(tag_text=tags[0], project=self.project0, color="ef2929")
     tag1 = Tag(tag_text=tags[1], project=self.project0, color="ef2929")
     tag2 = Tag(tag_text=tags[2], project=self.project0, color="ef2929")
     tag3 = Tag(tag_text=tags[3], project=self.project0, color="ef2929")
     tag0.save()
     tag1.save()
     tag2.save()
     tag3.save()
     self.selenium.get("{}{}".format(self.live_server_url, reverse('tag:tag', kwargs={'project': self.p0_short})))
     self.selenium.find_element(By.ID, 'id_select_all').click()
     self.selenium.find_element(By.ID, 'id_delete-tags').find_element(By.ID, 'id_submit_delete_tags').click()
     for tag in tags:
         self.assertNotIn(tag, self.selenium.page_source)
示例#3
0
 def test_random_colors(self):
     colors = set()
     for i in range(len(Tag.COLORS)):
         tag = Tag(tag_text=str(i), project=self.p2)
         tag.save()
         colors.add(tag.color)
     self.assertEqual(colors, set([a for a, b in Tag.COLORS]))
示例#4
0
    def setUp(self):
        self.user = get_user_model().objects.create_user(
            'a_user', '*****@*****.**', 'a1234568')
        self.project = Project(name="Projectname",
                               name_short="proj",
                               creator=self.user)
        self.project.save()
        self.project.manager.add(self.user)
        self.short = self.project.name_short

        tag = Tag(project=self.project, tag_text="foo")
        tag.save()
        Issue(project=self.project, title="a").save()
        issue = Issue(project=self.project, title="b")
        issue.save()
        issue.tags.add(tag)

        # Uses the cookie hack from:
        # https://stackoverflow.com/questions/22494583/login-with-code-when-using-liveservertestcase-with-django
        client = Client()
        client.login(username='******', password='******')
        self.cookie = client.cookies['sessionid']
        self.selenium.get("{}{}".format(self.live_server_url,
                                        reverse('invite_users:invite_users')))
        self.selenium.add_cookie({
            'name': 'sessionid',
            'value': self.cookie.value,
            'secure': False,
            'path': '/'
        })
        self.selenium.refresh()
示例#5
0
    def test_search_for_tag(self):
        tag = Tag(tag_text='Test', project=self.project)
        tag.save()
        self.issue.tags.add(tag)

        result = SearchFrontend.query('test', self.user)
        self.assertEqual(len(result), 2)

        result = SearchFrontend.query('Issue.tags.tag_text ~~ "es"', self.user)
        self.assertEqual(len(result), 1)
示例#6
0
    def test_search_for_tag(self):
        tag1 = Tag(tag_text='Test', project=Project.objects.get(name_short=p0_short))
        tag1.save()
        tag2 = Tag(tag_text='Test-Tag', project=Project.objects.get(name_short=p0_short))
        tag2.save()

        result = SearchFrontend.query('test', self.user)
        self.assertEqual(len(result), 2)

        result = SearchFrontend.query('Test-Tag', self.user)
        self.assertEqual(len(result), 1)

        # test fieldcheckings
        result = SearchFrontend.query('Tag.project.name_short ~~ "a"', self.user)
        self.assertEqual(len(result), 0)

        # test permission check
        user = get_user_model().objects.create_user('b', '*****@*****.**', 'b1234567')
        result = SearchFrontend.query('test', user)
        self.assertEqual(len(result), 0)
示例#7
0
    def setUpTestData(cls):
        # NOTE: if you modify those elements they need to be created in setUp, instead of here
        cls.user = get_user_model().objects.create_user(
            'test', '*****@*****.**', 'test1234')
        cls.user2 = get_user_model().objects.create_user(
            'tast', '*****@*****.**', 'test1234')
        cls.user3 = get_user_model().objects.create_user(
            'tust', '*****@*****.**', 'test1234')

        cls.project = Project(creator=cls.user, name_short=proj_short)
        cls.project.save()
        cls.project.developer.add(cls.user)

        cls.tag1 = Tag(project=cls.project, tag_text='backend', color='RED')
        cls.tag2 = Tag(project=cls.project, tag_text='frontend', color='BLUE')
        cls.tag1.save()
        cls.tag2.save()
        cls.kanbancol = KanbanColumn(project=cls.project,
                                     position=4,
                                     name='test')
        cls.kanbancol.save()
示例#8
0
    def test_only_project_specific_tags_manageable(self):
        # create tags for p0
        tag_texts = ['test-tag', 'test-2', 'test-tag3', '3-crap', 't-4_crap']
        tags = []
        for tag_text in tag_texts:
            tag = Tag(tag_text=tag_text, project=Project.objects.get(name_short=p0_short))
            tag.save()
            tags.append(tag)

        # p0 tags are not part of p1
        response = self.client.get(reverse('tag:tag', kwargs={'project': p1_short}), follow=True)
        for tag in tag_texts:
            self.assertNotContains(response, tag)
示例#9
0
    def restore_object(self, attrs, instance=None):

        if instance:
            # Update existing instance
            instance.id = attrs.get('id', instance.id)
            instance.namespace = attrs.get('namespace', instance.namespace)
            instance.note = attrs.get('namespace', instance.note)
            instance.name = attrs.get('name', instance.name)

        return instance
        
        # Create new instance
        return Tag(**attrs)
示例#10
0
    def setUp(self):
        # create user
        self.client = Client(enforce_csrf_checks=False)
        user = User.objects.create_user(
            username="******", email="test", password="******")

        # create Tags
        tag_black = Tag(name="black", user=user)
        tag_black.save()
        tag_white = Tag(name="white", user=user)
        tag_white.save()
        tag_red = Tag(name="red", user=user)
        tag_red.save()
        tag_fancy = Tag(name="fancy", user=user)
        tag_fancy.save()
        tag_verypretty = Tag(name="verypretty", user=user)
        tag_verypretty.save()

        # create Items
        item1 = Item(category="Outer", user=user)
        item1.save()
        item1.tags.add(tag_black, tag_white)
        item2 = Item(category="UpperBody", user=user)
        item2.save()
        item2.tags.add(tag_black, tag_red)
        item3 = Item(category="Accessories", user=user)
        item3.save()
        item3.tags.add(tag_black, tag_fancy)
        item4 = Item(category="verypretty", user=user)
        item4.save()
        item4.tags.add(tag_verypretty)

        # create Outfit
        outfit1 = Outfit(user=user, image_link="", date="2019-11-11",
                         tempAvg=3, tempIcon="happy", satisfaction=5)
        outfit1.save()
        outfit1.items.add(item1, item2, item3, item4)
        outfit1.save()
示例#11
0
    def setUpTestData(cls):
        # NOTE: if you modify those elements they need to be created in setUp, instead of here
        cls.user = get_user_model().objects.create_user('a', 'b', 'c')
        cls.project = Project(creator=cls.user, name_short='PRJ')
        cls.project.save()
        cls.project.manager.add(cls.user)
        cls.issue = Issue(title="Test-Issue",
                          project=cls.project,
                          kanbancol=cls.project.kanbancol.first(),
                          type="Bug")
        cls.issue.save()

        tag = Tag(tag_text='Test', project=cls.project)
        tag.save()
        cls.issue.tags.add(tag)
示例#12
0
文件: views.py 项目: duonghau/hoidap
 def post(self, request):
     form = QuestionForm(data=request.POST)
     if form.is_valid():
         question = Question(title=form.cleaned_data['title'],
                             content=form.cleaned_data['content'])
         question.author = request.user.profile
         question.save()
         for tagtitle in form.cleaned_data['tags']:
             try:
                 tag = Tag.objects.get(name=tagtitle)
             except ObjectDoesNotExist:
                 tag = Tag()
                 tag.name = tagtitle
                 tag.save()
             question.tags.add(tag)
             tag.save()
         question.author.rank += 0.01
         question.save()
         question.author.save()
         #notification
         users_notification = []
         for tag in question.tags.all():
             if tag.tag_followers.all().count() > 0:
                 for profile in tag.tag_followers.all():
                     if profile != request.user.profile and profile not in users_notification:
                         #create notification
                         notification = Notification()
                         notification.sender = request.user.profile
                         notification.recipient = profile
                         notification.action = 'addquestion'
                         notification.content_object = question
                         notification.save()
                         users_notification.append(profile)
         for follower in request.user.profile.followers.all():
             if follower not in users_notification:
                 notification = Notification()
                 notification.sender = request.user.profile
                 notification.recipient = follower
                 notification.action = 'addquestion'
                 notification.content_object = question
                 notification.save()
         return HttpResponseRedirect(
             reverse('question:detail', args=(question.pk, question.slug)))
     else:
         args = {}
         args['form'] = form
         args.update(csrf(request))
         return render(request, 'question_add.html', args)
示例#13
0
    def test_create_edit_issue_tags(self):
        # number of tags for the project self.project with short name proj_short
        response = self.client.get(
            reverse('project:tagac', kwargs={"project": proj_short}))
        response_json = response.json()
        self.assertEqual(len(response_json['results']),
                         len(Tag.objects.filter(project=self.project)))

        new_tag = Tag(project=self.project, tag_text='new_tag', color='YELLOW')
        new_tag.save()

        response = self.client.get(
            reverse('project:tagac', kwargs={"project": proj_short}))
        response_json = response.json()
        self.assertEqual(len(response_json['results']),
                         len(Tag.objects.filter(project=self.project)))
示例#14
0
    def handle(self, *args, **options):
        u = []
        for i in range(10):
            u.append(User(name="user{}".format(i), date=timezone.now()))

        for usr in u:
            usr.save()

        t = []
        for i in range(10):
            t.append(Tag(name="tag{}".format(i)))

        for tag in t:
            tag.save()

        q = []
        i = 1
        for usr in u:
            q.append(
                Question(title="question{}".format(i),
                         text="Lorem ipsum question from user: {}".format(usr),
                         date=timezone.now(),
                         user=usr))
            i += 1

        for qst in q:
            qst.save()

        for qst in q:
            tags = qst.tags
            for i in range(3):
                tags.add(t[rnd.randint(0, 9)])
            qst.save()

        a = []
        for que in q:
            for usr in u:
                a.append(
                    Answer(
                        text="Lorem ipsum answer from user: {}".format(usr),
                        date=timezone.now(),
                        user=usr,
                        qst=que,
                    ))

        for ans in a:
            ans.save()
示例#15
0
 def create(self, request, *args, **kwargs):
     tag_info = Tag.objects.filter(tag_name=request.data.get('tag_name'),
                                   is_delete=0).all()
     if len(tag_info) == 0:
         tag = Tag()
         if 'tag_name' in request.data.keys():
             tag.tag_name = request.data['tag_name']
         if 'tag_remark' in request.data.keys():
             tag.tag_remark = request.data['tag_remark']
         tag.create_time = datetime.now()
         tag.update_time = datetime.now()
         tag.save()
         result = model_to_dict(tag)
         return Response(result, status=status.HTTP_201_CREATED)
     else:
         result = {'msg': '标签名称已存在'}
         return Response(data=result, status=status.HTTP_409_CONFLICT)
示例#16
0
    def handle(self, *args, **options):
        if len(args) == 0:
            medias = Media.objects.filter(is_local=False)
            logger.info("Atualizando todos as copias locais dos medias")
        else:
            since = int(args[0])
            some_day_ago = timezone.now().date() - timedelta(days=since)
            logger.info("Atualizando os medias desde o dia: " +
                        str(some_day_ago))
            medias = Media.objects.filter(date__gte=some_day_ago)

        for media in medias:
            try:

                # Synchronize/update tags.
                #
                # 1) Add all tags found in the git-annex metadata and not
                # already present on the media.
                # 2) If tags from other mucuas have been deleted (are missing in
                # the git_annex metadata tags), remove them from this media.
                tags_on_media = set(git_annex_list_tags(media))
                existing_tags = set(
                    (t.namespace, t.name) for t in media.tags.all())
                # Add new tags to media
                for t in tags_on_media - existing_tags:
                    # Add tag - search for existing, if none found create new tag.
                    namespace, name = t
                    try:
                        tag = Tag.objects.get(name=unicode(name),
                                              namespace=unicode(namespace))
                    except Tag.DoesNotExist:
                        tag = Tag(name=name, namespace=namespace)
                        tag.save()
                    media.tags.add(tag)

                # Remove tags that were removed on remote media
                for t in existing_tags - tags_on_media:
                    namespace, name = t
                    tag = Tag.objects.get(name=name, namespace=namespace)
                    media.tags.remove(tag)

                media.save(is_syncing=True)

            except OSError, e:
                logger.debug('Requested media not found: ' + media.name)
示例#17
0
def add_book(request):
    context = dict()
    if request.method == 'POST':
        if 'url' in request.POST:
            url = request.POST['url']
            context = parse_book_by_url(url)
            return render(request, 'book/add.html', context)
        if 'bookid' in request.POST:
            bookid = request.POST['bookid']
            context = parse_book_by_id(bookid)
            book = Book()
            book.title = context['title']
            book.publisher = context['publisher']
            book.isbn = context['isbn10'] if 'isbn10' in context else context[
                'isbn13']
            book.url = context['url']
            book.ispersonal = int(True)
            book.ownerid = request.user.id
            book.summary = context['summary']
            book.price = context['price']
            book.numraters = 0
            book.averageRate = 3
            book.created_date = datetime.datetime.now()
            book.updated_date = datetime.datetime.now()
            book.author = context['author'][0]
            book.pubdate = context['pubdate']
            book.ispublic = int(True)
            book.imgurl = context['images']
            book.save()

            #save tags of book
            for val in context['tags']:
                tag = Tag()
                tag.value = val
                tag.createdate = datetime.datetime.now()
                tag.save()
                rel = Booktag()
                rel.tagid = tag.id
                rel.bookid = book.id
                rel.save()
            return redirect('/book/library', context)
    else:
        form = BookForm()
        context['form'] = form
        return render(request, 'book/add.html', context)
示例#18
0
    def _create_tags(self):
        taglist = ('環境', '地域', '人権', '教育', '医療', '介護', '国際協力', '文化', 'スポーツ',
                   '災害', '動物')
        user = User.objects.get(pk=1)
        for t in taglist:
            tag = Tag(name=t, )
            tag.save()

        for user in User.objects.all():
            tag = Tag.objects.get(pk=(user.pk % len(taglist) + 1))
            user.follow_tag.add(tag)

        for i, event in enumerate(
                Event.objects.filter(contact="*****@*****.**")):
            if i < 20:
                event.tag.add(Tag.objects.get(name='環境'))
            elif i < 30:
                event.tag.add(Tag.objects.get(name='教育'))
            elif i < 35:
                event.tag.add(Tag.objects.get(name='介護'))
            elif i < 36:
                event.tag.add(Tag.objects.get(name='災害'))
示例#19
0
def add_and_synchronize_tags(media, tags, mucua):
    """
    Add tags to media, synchronize with git-annex repository.
    """
    # Remove tags that originate in this mucua
    for tag in media.tags.filter(namespace__contains=mucua.uuid):
        media.tags.remove(tag)

    # Now add each tag in list.
    for tag in tags:
        if not tag or tag.isspace():
            continue
        try:
            tag = tag.strip()
            tag = Tag.objects.filter(name=tag)[0]
        except (Tag.DoesNotExist, IndexError):
            tag = Tag(name=tag, namespace=mucua.uuid + "-tag")
            # TODO: Handle namespaces!
            tag.save()

        media.tags.add(tag)

    # Synchronize tags
    # First, add new ones as metadata on files.
    tags = media.tags.all()
    existing_tags = git_annex_list_tags(media)
    for t in media.tags.all():
        if (t.namespace, t.name) not in existing_tags:
            git_annex_add_tag(media, t.namespace, t.name)
    # Then, *remove* tags that are no longer present. 
    # Only remove tags set with present namespace!
    for namespace, name in existing_tags:
        if namespace.startswith(mucua.uuid) and not (namespace, name) in [
            (t.namespace, t.name) for t in tags
            ]:
            git_annex_remove_tag(media, namespace, name)
示例#20
0
def outfit(request):
    user1 = request.user

    if request.method == 'GET':

        response_array = []

        for _outfit in Outfit.objects.filter(user=user1).all():
            weather_dict = {
                "tempAvg": _outfit.tempAvg,
                "icon": _outfit.tempIcon
            }

            items_array = []
            for item in _outfit.items.all():
                item_to_add = {
                    "id": item.id,
                    "category": item.category,
                    "tags": [tag.name for tag in item.tags.all()]
                }
                items_array.append(item_to_add)

            outfit_dict = {
                "id": _outfit.id,
                "image": _outfit.image_link,
                "date": _outfit.dateWithTime,
                "satisfactionValue": _outfit.satisfaction,
                "weather": weather_dict,
                "items": items_array
            }

            response_array.append(outfit_dict)
        return JsonResponse(response_array, safe=False, status=200)

    elif request.method == 'POST':
        try:
            body = request.body.decode()
            request_dict = json.loads(body)

            date = request_dict["date"]
            satisfaction = request_dict["satisfactionValue"]
            tempIcon = request_dict["weather"]["icon"]
            tempAvg = request_dict["weather"]["tempAvg"]
            image = request_dict["image"]
            items = request_dict["items"]

            items_for_new_outfit = []
            for item in items:
                tags_per_item = []
                itemExists = True
                item_candidates = []
                i = 0
                print("tag names array from front: ")
                print(item["tags"])
                for tag_name in item[
                        "tags"]:  # tags=["black", "white", "2019"]
                    try:
                        print("current tag name: ")
                        print(tag_name)
                        tag = Tag.objects.get(name=tag_name)
                        tags_per_item.append(tag)

                        if itemExists:
                            if i is 0:
                                item_candidates = [
                                    item
                                    for item in tag.items_with_this_tag.all()
                                ]
                                print("item_candidates first print: ")
                                print(item_candidates)
                                i = 1

                            else:
                                item_candidates_read = copy.deepcopy(
                                    item_candidates)
                                for item_candidate in item_candidates_read:
                                    print("item_candidate, tag: ")
                                    print(item_candidate, tag.name)
                                    itemExists = tag in item_candidate.tags.all(
                                    )

                                    print("itemExists_in item candidate: ")
                                    print(itemExists)

                                    print(tag.name + ": ")
                                    print(item_candidates)
                                    if not itemExists:
                                        item_candidates.remove(item_candidate)
                                        print(tag.name + "(after remove): ")
                                        print(item_candidates)
                            # 지금 보고있는 tag의 itmes들을 가져온다
                            # 이전에 저장되어 있던 item_candidate와의 교집합을 찾는다 (?)
                            # 교집한 없으면 itemExists 에 false를 넣는다
                    except Tag.DoesNotExist:
                        # check user
                        print("Inside New Tag")
                        itemExists = False
                        item_candidates = []
                        new_tag = Tag(name=tag_name, user=user1)
                        new_tag.save()
                        print("New Tag: ")
                        print(new_tag.name)
                        tags_per_item.append(new_tag)
                # tag 없는 애는 생성, 있는애는 객체로 받아서 받아서 tags안에 다 들어있음
                # itemExists 이미 존재하는 item이 잇는지 확인 끝
                item_candidates = filter(
                    lambda x: x.category == item["category"] and x.tags.all().
                    count() == len(item["tags"]), item_candidates)
                # convert filter object to list
                item_candidates = list(item_candidates)
                print("item_candidates: ")
                print(item_candidates)
                if len(item_candidates) > 1:
                    print("...it is literally disaster")
                    print(item_candidates)

                itemExists = len(item_candidates) == 1

                if itemExists:
                    assert len(item_candidates) == 1, "...inside itemExists"
                    items_for_new_outfit.append(item_candidates[0])
                    print("items_for_new_outfit: ")
                    print(items_for_new_outfit)

                else:
                    new_item = Item(category=item["category"],
                                    user=user1)  # check user
                    new_item.save()
                    for tag in tags_per_item:
                        new_item.tags.add(tag)
                    new_item.save()
                    items_for_new_outfit.append(new_item)
                    # true -> itemCandidates 안에 list item id.
                    # category가 같은 애들 먼저 filter
                    # finally tags length equality check -> itemExtist true? 바로 그 item을 get해와서 item 배열에 넣고 : false면 새로 item생성해서 배열에 넣고

                print("itemExists_received: ")
                print(itemExists)

            new_outfit = Outfit(image_link=image,
                                dateWithTime=date,
                                date=change_date_format(date),
                                satisfaction=satisfaction,
                                tempIcon=tempIcon,
                                tempAvg=tempAvg,
                                user=user1)
            new_outfit.save()

            print("items_for_new_outfit: right before saving outfit: ")
            print(items_for_new_outfit)
            for item in items_for_new_outfit:
                new_outfit.items.add(item)
            new_outfit.save()

            response_dict_weather = {
                "tempAvg": new_outfit.tempAvg,
                "icon": new_outfit.tempIcon
            }
            response_dict_items = []
            for item in new_outfit.items.all():
                item_to_add = {
                    "id": item.id,
                    "category": item.category,
                    "tags": [tag.name for tag in item.tags.all()]
                }
                response_dict_items.append(item_to_add)

            response_dict = {
                "id": new_outfit.id,
                "image": new_outfit.image_link,
                "date": new_outfit.dateWithTime,
                "satisfactionValue": new_outfit.satisfaction,
                "weather": response_dict_weather,
                "items": response_dict_items
            }
            print(response_dict)

            return JsonResponse(response_dict, status=201)

        except (KeyError, JSONDecodeError) as e:
            return HttpResponseBadRequest()

    else:
        return HttpResponseNotAllowed(['GET', 'POST'])
示例#21
0
import random as rnd

from user.models import User
from tag.models import Tag
from question.models import Question
from answer.models import Answer
from like.models import Like

u = []
for i in range(10):
    u.append(User(name="user{}".format(i), date=timezone.now()))
    u[i].save()

t = []
for i in range(10):
    t.append( Tag(name="tag{}".format(i)) )
    t[i].save()

q = []
for usr in u:
    for i in range(10):
        q.append(
            Question(
                title = "question{}".format(i),
                text = "Lorem ipsum hello from {}".format(i),
                date = timezone.now(),
                user = usr
            )
        )
        q[i].save()
示例#22
0
def specificOutfit(request, outfit_id):
    user1 = request.user

    try:
        outfit = Outfit.objects.get(pk=outfit_id)
    except Outfit.DoesNotExist:
        return HttpResponse(status=404)
    if request.method == 'GET':
        response_dict_weather = {
            "tempAvg": outfit.tempAvg,
            "icon": outfit.tempIcon
        }
        response_dict_items = []
        for item in outfit.items.all():
            item_to_add = {
                "id": item.id,
                "category": item.category,
                "tags": [tag.name for tag in item.tags.all()]
            }
            response_dict_items.append(item_to_add)

        response_dict = {
            "id": outfit.id,
            "image": outfit.image_link,
            "date": outfit.dateWithTime,
            "satisfactionValue": outfit.satisfaction,
            "weather": response_dict_weather,
            "items": response_dict_items
        }

        return JsonResponse(response_dict, status=200)
    elif request.method == 'DELETE':
        for item in outfit.items.all():
            # print("item list in this outfit : "+list(outfit.items))
            if item.outfits_having_this_item.all().count() == 1:
                for tag in item.tags.all():
                    if tag.items_with_this_tag.all().count == 1:
                        tag.delete()
                item.delete()
        # if item.outfits_having_this_item 의 length가 1이면. item도 지워줘
        # if tag.items_with_this_tag의 length가 1이면 tag도 지워줘
        outfit.delete()
        return HttpResponse(status=200)

    else:  # PUT
        try:
            body = request.body.decode()
            # body로 들어온 outfit의 dict형태가 response_dict에 들어있음
            request_dict = json.loads(body)
            date = request_dict["date"]
            satisfaction = request_dict["satisfactionValue"]
            tempIcon = request_dict["weather"]["icon"]
            tempAvg = request_dict["weather"]["tempAvg"]
            # image는 edit page에서 애초에 바꿀 수 없으므로 image관련된 put작업은 생략
            items = request_dict["items"]
            #items_in_current_outfit = outfit.items.all()
            items_for_edited_outfit = []
            for item in items:
                tags_per_item = []
                itemExists = True
                item_candidates = []
                i = 0
                for tag_name in item["tags"]:
                    try:
                        tag = Tag.objects.get(name=tag_name)
                        tags_per_item.append(tag)  #이미 존재하는 태그라면 바로 넣어준다
                        if itemExists:
                            if i is 0:  #현재 아이템의 첫번째 태그를 보고 있다면 여기로 들어온다 -  itemExists가 당연 true 였을 것이다.
                                item_candidates = [
                                    item
                                    for item in tag.items_with_this_tag.all()
                                ]  #현재 보고있는 태그가 포함된 모든 item이 후보가 될 수 있으므로 다 넣어준다
                                i = 1  #두번째 태그 볼때부터는 여기에 못들어오도록 i 값 update
                            else:  #현재 아이템의 첫번째 태그를 보고 있는게 아니라면
                                item_candidates_read = copy.deepcopy(
                                    item_candidates
                                )  #원래의 item_cadidates를 해치지 않기 위해 값만 복사한 read용 array만든다 for문의 이상한 특징을 방어하기 위해 만듬.
                                for item_candidate in item_candidates_read:
                                    itemExists = tag in item_candidate.tags.all(
                                    )  #지금 보고 있는 태그가 itemCandidate 안에 들어있는 지 확인
                                    if not itemExists:  #현재 보고 있는 item candidate에 지금 보고 있는 tag가 없다는게 발각되면.. 그 아이템을 후보에서 지워준다
                                        item_candidates.remove(item_candidate)

                    except Tag.DoesNotExist:  #없는 태그라면
                        itemExists = False
                        item_candidates = []  #후보 item candidate 다 비워준다
                        new_tag = Tag(name=tag_name, user=user1)  #새로운 태그를 생성하고
                        new_tag.save()  #태그를 저장해준다
                        tags_per_item.append(
                            new_tag)  #그리고 그 태그를 아이템에 들어가있는 태그 리스트에 추가해준다
        # 현재 넘어온 outfit 객체의 생김새
        # id 가 outfit id인 애를 찾았잖아 우선?
                item_candidates = filter(
                    lambda x: x.category == item["category"] and x.tags.all(
                    ).count() == len(item["tags"]), item_candidates
                )  #item candidate에 들어있는 애들 중에 category도 같고, tag 개수도 같은 애들만 filtering
                item_candidates = list(item_candidates)
                assert len(item_candidates) <= 1, "...it is literally disaster"

                itemExists = len(item_candidates) == 1

                if itemExists:
                    assert len(item_candidates) == 1, "...inside itemExists"
                    items_for_edited_outfit.append(
                        item_candidates[0])  #이미 있는 item임을 확인했으니 그냥 그 친구를 넣어준다
                    #item을 포함하고 있는 outfit이 1개이고, item_candidate[0]의 id가 지금보고있는 item의 id가 다르면 지금 item을 지우자

                else:
                    new_item = Item(category=item["category"], user=user1)
                    new_item.save()
                    for tag in tags_per_item:
                        new_item.tags.add(tag)
                    new_item.save()
                    items_for_edited_outfit.append(new_item)
                    #item을 포함하고 있는 outfit이 1개였다면 바로 지운다.

            outfit.dateWithTime = date
            outfit.date = change_date_format(date)
            outfit.satisfaction = satisfaction
            outfit.tempIcon = tempIcon
            outfit.tempAvg = tempAvg
            for prev_item in outfit.items.all():
                if prev_item in items_for_edited_outfit:
                    pass
                else:
                    if prev_item.outfits_having_this_item.all().count() == 1:
                        for prev_tag in prev_item.tags.all():
                            if prev_tag.items_with_this_tag.all().count() == 1:
                                prev_tag.delete()
                        prev_item.delete()

                #만약에 prev_item이 items_for_edited_outfit 에 들어있지 않고,
                # prev_item.outfits_having_this_item의 길이가  1이라면
                #for prev_tag in prev_item.tags.all()
                #if prev_tag.items_with_this_tag.all().count == 1
                #prev_tag.delete()
                #    prev_item.delete()
                #'''
            outfit.items.clear()  #기존에 있던 모든 item관게를 끊어준다

            for item in items_for_edited_outfit:
                outfit.items.add(item)
            outfit.save()

            response_dict_weather = {
                "tempAvg": outfit.tempAvg,
                "icon": outfit.tempIcon
            }

            response_dict_items = []
            for item in outfit.items.all():
                item_to_add = {
                    "id": outfit.id,
                    "category": item.category,
                    "tags": [tag.name for tag in item.tags.all()]
                }
                response_dict_items.append(item_to_add)
            response_dict = {
                "id": outfit.id,
                "image": outfit.image_link,
                "date": outfit.dateWithTime,
                "satisfactionValue": outfit.satisfaction,
                "weather": response_dict_weather,
                "items": response_dict_items
            }
            return JsonResponse(response_dict, status=200)
        except (KeyError, JSONDecodeError) as e:
            print(e)
            return HttpResponseBadRequest()
示例#23
0
def roadmap_id(request, roadmap_id):
    if request.method == "GET":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()

        roadmap_dict = roadmap.to_dict()
        return JsonResponse(roadmap_dict)

    elif request.method == "PUT":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()
        if not roadmap.author_id == request.user.id:
            return HttpResponseForbidden()
        try:
            req_data = json.loads(request.body.decode())
            new_private = req_data["private"]
            new_image_id = req_data["imageId"]
            new_title = req_data["title"]
            new_level = req_data["level"]
            new_description = req_data["description"]
            section_list = req_data["sections"]
            added_tag_list = req_data["addedTagList"]
            deleted_tag_list = req_data["deletedTagList"]

        except (KeyError, JSONDecodeError):
            return HttpResponseBadRequest()

        # Edit
        roadmap.delete_sections()
        roadmap.private = new_private
        roadmap.image_id = new_image_id
        roadmap.title = new_title
        roadmap.level = new_level
        roadmap.description = new_description
        for section in section_list:
            new_section = Section(title=section["section_title"],
                                  roadmap=roadmap)
            new_section.save()

            task_list = section["tasks"]
            for task in task_list:
                Task(
                    title=task["task_title"],
                    url=task["task_url"],
                    type=task["task_type"],
                    description=task["task_description"],
                    roadmap=roadmap,
                    section=new_section,
                ).save()

        # Set default value or non-changing
        roadmap.date = datetime.now()
        roadmap.progress = 1

        roadmap.save()

        # Delete tags in roadmap
        for tag in deleted_tag_list:
            tag_query = roadmap.tags.filter(tag_name__iexact=tag)
            if tag_query.exists():
                target_tag = tag_query.first()
                target_tag.decrement_count_roadmap()
                target_tag.save()
                roadmap.tags.remove(target_tag)

        # Add new tags m2m field in roadmap
        for tag in added_tag_list:
            tag_query = Tag.objects.filter(tag_name__iexact=tag)
            if tag_query.exists():
                target_tag = tag_query.first()
                roadmap.tags.add(target_tag)
                target_tag.increment_count_roadmap()
                target_tag.save()
            else:
                new_tag = Tag(tag_name=tag)
                new_tag.increment_count_roadmap()
                new_tag.save()
                roadmap.tags.add(new_tag)

        roadmap.save()
        roadmap_dict_simple = roadmap.to_dict_simple()
        return JsonResponse(roadmap_dict_simple, status=200)

    elif request.method == "DELETE":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()
        if not roadmap.author_id == request.user.id:
            return HttpResponseForbidden()

        for tag in roadmap.tags.all():
            tag.decrement_count_roadmap()
            tag.save()

        roadmap.delete()
        return HttpResponse(status=204)

    elif request.method == "POST":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()

        new_roadmap = Roadmap(
            private=roadmap.private,
            image_id=roadmap.image_id,
            title=roadmap.title,
            level=roadmap.level,
            description=roadmap.description,
            original_author=roadmap.author,
            author=request.user,
        )
        new_roadmap.save()

        # Add copied tags m2m fields
        for tag in roadmap.tags.all():
            new_roadmap.tags.add(tag)
            tag.increment_count_roadmap()
            tag.save()
        new_roadmap.save()

        # Add copied sections and tasks
        for section in roadmap.section_roadmap.all():
            new_section = Section(title=section.title, roadmap=new_roadmap)
            new_section.save()

            for task in section.task_section.all():
                Task(
                    title=task.title,
                    url=task.url,
                    type=task.type,
                    description=task.description,
                    roadmap=new_roadmap,
                    section=new_section,
                ).save()

        # Post response
        roadmap_dict_simple = new_roadmap.to_dict_simple()
        return JsonResponse(roadmap_dict_simple, status=201)
示例#24
0
def roadmap(request):
    if request.method == "POST":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            req_data = json.loads(request.body.decode())
            new_private = req_data["private"]
            new_image_id = req_data["imageId"]
            new_title = req_data["title"]
            new_level = req_data["level"]
            new_description = req_data["description"]
            section_list = req_data["sections"]
            tag_list = req_data["tags"]
        except (KeyError, JSONDecodeError):
            return HttpResponseBadRequest()

        new_roadmap = Roadmap(
            private=new_private,
            image_id=new_image_id,
            title=new_title,
            level=new_level,
            description=new_description,
            original_author=request.user,
            author=request.user,
        )
        new_roadmap.save()

        # Add tags m2m field in new_roadmap
        for tag in tag_list:
            tag_query = Tag.objects.filter(tag_name__iexact=tag)
            if tag_query.exists():
                target_tag = tag_query.first()
                new_roadmap.tags.add(target_tag)
                target_tag.increment_count_roadmap()
                target_tag.save()

            else:
                new_tag = Tag(tag_name=tag)
                new_tag.increment_count_roadmap()
                new_tag.save()
                new_roadmap.tags.add(new_tag)

        new_roadmap.save()

        # Add sections and tasks of this roadmap
        for section in section_list:
            new_section = Section(title=section["section_title"],
                                  roadmap=new_roadmap)
            new_section.save()

            task_list = section["tasks"]
            for task in task_list:
                Task(
                    title=task["task_title"],
                    url=task["task_url"],
                    type=task["task_type"],
                    description=task["task_description"],
                    roadmap=new_roadmap,
                    section=new_section,
                ).save()

        # Post response
        roadmap_dict_simple = new_roadmap.to_dict_simple()
        return JsonResponse(roadmap_dict_simple, status=201)

    return HttpResponseNotAllowed(["POST"])
示例#25
0
def create_objects_from_files(repository=get_default_repository().name):
    """Recria os midias no Django a partir dos medias serializados em JSON."""
    try:
        repository = Repository.objects.get(name=repository)
    except Repository.DoesNotExist:
        return None

    logger.info(u">>> %s" % _('DESERIALIZING'))
    logger.info(u"%s: %s" % (_('Repository'), repository))
    #logger.debug(u"%s \n %s" % (_('List of media found in repository..'), get_latest_media(repository)))
    try:
        for serialized_media in get_latest_media(repository):
            logger.info(u"%s: %s" % (_('Serialized Media'), serialized_media))
            media_json_file_path = os.path.join(REPOSITORY_DIR,
                                                repository.name,
                                                serialized_media)
            if os.path.isfile(media_json_file_path):
                with open(media_json_file_path) as media_json_file:
                    try:
                        data = JSONParser().parse(media_json_file)
                    except:
                        print u"Problem parsing JSON: " + media_json_file.read(
                        )
                        continue

                try:
                    media = Media.objects.get(uuid=data["uuid"])
                    serializer = MediaSerializer(media,
                                                 data=data,
                                                 partial=True)
                    print serializer.is_valid()
                    print serializer.errors
                    serializer.object.save(is_syncing=True)
                    logger.info(u"%s" %
                                _('This media already exist. Updated.'))
                except Media.DoesNotExist:
                    serializer = MediaSerializer(data=data)
                    print serializer.is_valid()
                    print serializer.errors
                    serializer.object.save(is_syncing=True)
                    media = serializer.object
                    logger.info(u"%s" % _('New media created'))

                # Synchronize/update tags.
                #
                # 1) Add all tags found in the git-annex metadata and not
                # already present on the media.
                # 2) If tags from other mucuas have been deleted (are missing in
                # the git_annex metadata tags), remove them from this media.
                tags_on_media = set(git_annex_list_tags(media))
                existing_tags = set(
                    (t.namespace, t.name) for t in media.tags.all())
                # Add new tags to media
                for t in tags_on_media - existing_tags:
                    # Add tag - search for existing, if none found create new tag.
                    namespace, name = t
                    try:
                        tag = Tag.objects.get(name=unicode(name),
                                              namespace=unicode(namespace))
                    except Tag.DoesNotExist:
                        tag = Tag(name=name, namespace=namespace)
                        tag.save()
                    media.tags.add(tag)

                # Remove tags that were removed on remote media
                for t in existing_tags - tags_on_media:
                    namespace, name = t
                    tag = Tag.objects.get(name=name, namespace=namespace)
                    media.tags.remove(tag)

    except CommandError:
        pass
示例#26
0
 def post(self,request):
     tag = Tag(name=request.POST['name'])
     tag.save()
     return self.render_to_response({"tag_id":tag.id})
示例#27
0
    def test_assign_tag_view(self):
        issue = Issue(title="Test-Issue",
                      project=self.project,
                      kanbancol=self.column,
                      type="Bug")
        issue.save()
        t0 = 'first_tag'
        tag0 = Tag(tag_text=t0, project=self.project)
        tag0.save()
        t1 = 'second_tag'
        tag1 = Tag(tag_text=t1, project=self.project)
        tag1.save()
        t2 = 'third_tag'
        tag2 = Tag(tag_text=t2, project=self.project)
        tag2.save()
        values = {
            # first_tag
            'tags': (1)
        }
        response = self.client.post(
            reverse('issue:edit',
                    kwargs={
                        'project': self.project.name_short,
                        'sqn_i': 1
                    }), values)
        # please don't ask me why the following (which would be a way better assert) doesn't work
        # self.assertContains(response, t0)
        self.assertIn(t0, str(response.content))
        self.assertEqual(Issue.objects.count(), 1)
        # TODO
        """
        self.assertEqual(issue.tags.count(), 1)
        self.assertEqual(issue.tags.first().text, t0)
        """
        response = self.client.get(
            reverse('issue:edit',
                    kwargs={
                        'project': self.project.name_short,
                        'sqn_i': 1
                    }))

        return
        # TODO TODO TODO the following doesn't work because t0 doesn't appear in the response anymore
        self.assertContains(response, t0)
        # self.assertIn(t0, str(response.content))
        values = {
            # 'tags': [t2, t1],
            'tags': [(3), (2)],
        }
        response = self.client.post(
            reverse('issue:edit',
                    kwargs={
                        'project': self.project.name_short,
                        'sqn_i': 1
                    }), values)
        self.assertContains(response, t0)
        self.assertContains(response, t2)
        self.assertContains(response, t1)

        response = self.client.get(
            reverse('issue:edit',
                    kwargs={
                        'project': self.project.name_short,
                        'sqn_i': 1
                    }))
        self.assertContains(response, t0)
        self.assertContains(response, t2)
        self.assertContains(response, t1)
示例#28
0
    def test_show_matching_issues_and_color(self):
        project_name = "project"
        project_short = "cccc"
        project = Project(name=project_name, name_short=project_short, creator=self.user)
        project.save()
        project.developer.add(self.user)
        project.save()
        yellow_text = "yellow"
        yellow = Tag(tag_text=yellow_text, color=self.get_color_by_name("yellow"), project=project)
        yellow.save()
        blue_text = "blue"
        blue = Tag(tag_text=blue_text, color=self.get_color_by_name("blue"), project=project)
        blue.save()
        red_text = "red"
        red = Tag(tag_text=red_text, color=self.get_color_by_name("red"), project=project)
        red.save()
        ye_issue_title = "ye_issue"
        yellow_issue = Issue(title=ye_issue_title, project=project)
        yellow_issue.save()
        yellow_issue.tags.add(yellow)
        yellow_issue.save()
        bl_issue_title = "bl_issue"
        blue_issue = Issue(title=bl_issue_title, project=project)
        blue_issue.save()
        blue_issue.tags.add(blue)
        blue_issue.save()
        re_issue_title = "re_issue"
        red_issue = Issue(title=re_issue_title, project=project)
        red_issue.save()
        red_issue.tags.add(blue)
        red_issue.save()
        ye_re_issue_title = "ye_re_issue"
        yellow_red_issue = Issue(title=ye_re_issue_title, project=project)
        yellow_red_issue.save()
        yellow_red_issue.tags.add(yellow)
        yellow_red_issue.tags.add(red)
        yellow_red_issue.save()
        response = self.client.get(reverse('tag:tag', kwargs={'project': project_short}), follow=True)
        text = response.content.decode()
        skip_color_choice = text.index("create_tag")

        # test yellow
        text_index = text[skip_color_choice:].index(yellow_text)+skip_color_choice
        # color
        style_start = text[skip_color_choice:text_index].rindex("div class")+skip_color_choice
        self.assertTrue(len(re.findall(self.get_color_by_name("yellow"), text[style_start:text_index])) == 1)
        # issue-relation
        # NOTE: Don't use title as search, because this element is not there if there are no issues for this tag
        #       that's y we determine the beginning and the end of the area where the issue-element should be
        color_start = text[text_index:].index("col-md-8 col-xs-5")+text_index
        color_end = text[color_start:].index("/div")+color_start
        color_values = re.findall(ye_issue_title, text[color_start:color_end])
        # two: one for the href-title and one for the actual issue-name
        self.assertTrue(len(color_values) == 2)

        # test blue
        text_index = text[skip_color_choice:].index(blue_text)+skip_color_choice
        # color
        style_start = text[skip_color_choice:text_index].rindex("div class")+skip_color_choice
        self.assertTrue(len(re.findall(self.get_color_by_name("blue"), text[style_start:text_index])) == 1)
        # issue-relation
        color_start = text[text_index:].index("col-md-8 col-xs-5")+text_index
        color_end = text[color_start:].index("/div")+color_start
        color_values = re.findall(bl_issue_title, text[color_start:color_end])
        self.assertTrue(len(color_values) == 2)

        # test red
        text_index = text[skip_color_choice:].index(red_text)+skip_color_choice
        # color
        style_start = text[skip_color_choice:text_index].rindex("div class")+skip_color_choice
        self.assertTrue(len(re.findall(self.get_color_by_name("red"), text[style_start:text_index])) == 1)
        # issue-relation
        color_start = text[text_index:].index("col-md-8 col-xs-5")+text_index
        color_end = text[color_start:].index("/div")+color_start
        color_values = re.findall(re_issue_title, text[color_start:color_end])
        self.assertTrue(len(color_values) == 2)

        # test yellow_red
        # test in yellow
        text_index = text[skip_color_choice:].index(yellow_text)+skip_color_choice
        color_start = text[text_index:].index("col-md-8 col-xs-5") + text_index
        color_end = text[color_start:].index("/div")+color_start
        color_values = re.findall(ye_re_issue_title, text[color_start:color_end])
        self.assertTrue(len(color_values) == 2)
        # test in red
        text_index = text[skip_color_choice:].index(red_text)+skip_color_choice
        color_start = text[text_index:].index("col-md-8 col-xs-5")+text_index
        color_end = text[color_start:].index("/div")+color_start
        color_values = re.findall(ye_re_issue_title, text[color_start:color_end])
        self.assertTrue(len(color_values) == 2)
示例#29
0
    def test_parser(self):
        # contains test strings and the expected length of the attrs_to_set list
        # the third field indicates whether an issue shoud have been created
        tag = Tag(project=self.project, tag_text="testtag")
        tag.save()
        tag2 = Tag(project=self.project, tag_text="zweitertag")
        tag2.save()

        tests = [
            ['Fancy task :Task &Todo', 2, True],
            [
                'Another fancy task :Bug !2 #testtag @a ;with description', 5,
                True
            ],
            ['>PRJ-1 !2 :Bug', 2, False],
            ['>2 $8', 1, False],
        ]

        for t in tests:
            parser.compile(t[0], self.project, self.user)
            self.assertEqual(len(parser.attrs_to_set), t[1])
            self.assertEqual(parser.issue_created, t[2])
            # all the above expressions should set issue_changed to True
            self.assertEqual(parser.issue_changed, True)

        # now we should have two new issues, check also their numbers
        self.assertEqual(Project.objects.first().issue.count(), 2)
        self.assertEqual(Issue.objects.filter(title="Fancy task").count(), 1)
        self.assertEqual(
            Issue.objects.filter(project=self.project, number=1).count(), 1)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=1).first().creator, self.user)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=1).first().kanbancol.name, 'Todo')
        self.assertEqual(
            Issue.objects.filter(project=self.project, number=2).count(), 1)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=2).first().storypoints, 8)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=2).first().description,
            'with description')
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=2).first().creator, self.user)

        # validate that fancy task is of type bug
        self.assertEqual(
            Issue.objects.filter(title="Fancy task", type="Bug").count(), 1)

        # validate that Another fancy task is of type bug with given attributes
        self.assertEqual(
            Issue.objects.filter(title="Another fancy task",
                                 type="Bug",
                                 priority=2,
                                 assignee=self.user,
                                 tags=tag).count(), 1)

        # set description of Another fancy task
        parser.compile('>PRJ-2 ;new description', self.project, self.user)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=2).first().description,
            'new description')

        # set kanbancol of Fancy task
        parser.compile('>PRJ-1 &Progr', self.project, self.user)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=1).first().kanbancol.name,
            'In Progress')

        # test icontains when setting kanbancol
        self.assertRaises(Exception, parser.compile, '>PRJ-1 &done',
                          self.project, self.user)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=1).first().kanbancol.name,
            'In Progress')

        parser.compile('>PRJ-1 &Done', self.project, self.user)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 number=1).first().kanbancol.name, 'Done')

        # add second tag and new assignee to PRJ2 and validate
        currentID = self.project.nextTicketId
        parser.compile('>PRJ-2 #zweitertag @d', self.project, self.user)
        issue = Issue.objects.get(title="Another fancy task")
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(parser.issue_to_change, issue)
        self.assertEqual(issue.tags.count(), 2)
        self.assertEqual(issue.assignee.count(), 2)
        self.assertIn(self.user, issue.assignee.all())
        self.assertIn(self.user2, issue.assignee.all())
        self.assertEqual(issue.number, 2)
        self.project.refresh_from_db()
        self.assertEqual(currentID, self.project.nextTicketId)

        # test permission checks and validations
        user = get_user_model().objects.create_user('g', 'h', 'i')
        issue.tags.clear()
        issue.refresh_from_db
        self.assertEqual(issue.tags.count(), 0)

        # not existing issues may not be edited and nextTicketId must not change
        currentID = self.project.nextTicketId
        self.assertRaises(Exception, parser.compile, '>PRJ-3 #zweitertag @d',
                          self.project, self.user)
        self.project.refresh_from_db()
        self.assertEqual(currentID, self.project.nextTicketId)

        # user must not edit projects to which he has no devel access
        self.assertRaises(Exception, parser.compile, '>PRJ-2 #zweitertag @d',
                          self.project, user)

        # only users with access to project may be set as assignee
        self.assertRaises(Exception, parser.compile, '>PRJ-2 #zweitertag @g',
                          self.project, self.user)

        # tags must not have changed
        issue.refresh_from_db
        self.assertEqual(issue.tags.count(), 0)

        # create another tag containing a space
        tag = Tag(project=self.project, tag_text="tag with spaces")
        tag.save()
        parser.compile('>PRJ-2 #tag with spaces @d', self.project, self.user)
        self.assertEqual(parser.issue_changed, True)
        issue.refresh_from_db()
        self.assertEqual(issue.tags.filter(pk=tag.pk).count(), 1)

        # dependent issue must exist and be in the same project
        parser.compile('Test-Issue proj2 :Bug', self.project2, self.user)
        self.assertEqual(parser.issue_created, True)
        self.assertEqual(parser.issue_changed, True)
        issue = Issue.objects.get(title="Test-Issue proj2")
        self.assertEqual(parser.issue_to_change, issue)
        self.assertEqual(
            Issue.objects.filter(project=self.project2).count(), 1)
        self.assertRaises(Exception, parser.compile, '>TPJ-1 ~PRJ-1',
                          self.project, self.user)

        # log time to issue
        parser.compile('>PRJ-1 +2h5m', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        # logging time is no change action
        self.assertEqual(parser.issue_changed, False)
        t = Timelog.objects.get(issue__title='Fancy task')
        self.assertEqual(t.time.total_seconds(), 7500)

        # log many times to issue
        parser.compile('>PRJ-1 +2h5m +1m', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, False)
        self.assertEqual(
            Timelog.objects.filter(issue__title='Fancy task').count(), 3)
        totaltime = 0
        for log in Timelog.objects.filter(issue__title='Fancy task'):
            totaltime += log.time.total_seconds()
        self.assertEqual(totaltime, 15060)

        # log time to new issue
        issuetitle = 'Timelog-test-issue'
        parser.compile(issuetitle + ' +2h5m', self.project, self.user)
        self.assertEqual(parser.issue_created, True)
        self.assertEqual(parser.issue_changed, False)
        self.assertEqual(Issue.objects.filter(title=issuetitle).count(), 1)
        t = Timelog.objects.get(issue__title=issuetitle)
        self.assertEqual(t.time.total_seconds(), 7500)

        # test empty timelog field (must not create new timelog object, should still be 3)
        parser.compile('>PRJ-1 +', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, False)
        self.assertEqual(
            Timelog.objects.filter(issue__title='Fancy task').count(), 3)

        # some syntactic stuff that should fail
        tests = [
            'Test-String ',
            '> @a',
            '>PRJ-2',
        ]

        for t in tests:
            self.assertRaises(Exception, parser.compile, t, self.project,
                              self.user)

        # tests for contains checks of tag
        Issue.objects.get(title='Fancy task').tags.clear()
        self.assertRaises(Exception, parser.compile, '>PRJ-1 #tag',
                          self.project, self.user)
        self.assertEqual(Issue.objects.get(title='Fancy task').tags.count(), 0)
        parser.compile('>PRJ-1 #ttag', self.project, self.user)
        self.assertEqual(Issue.objects.get(title='Fancy task').tags.count(), 1)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)

        tag3 = Tag(project=self.project, tag_text="ttag")
        tag3.save()
        parser.compile('>PRJ-1 #ttag', self.project, self.user)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(Issue.objects.filter(tags=tag3).count(), 1)
        self.assertEqual(Issue.objects.get(title='Fancy task').tags.count(), 2)

        # check that searching for tag is case insensitive
        Issue.objects.get(title='Fancy task').tags.clear()
        parser.compile('>PRJ-1 #teStTaG', self.project, self.user)
        self.assertEqual(Issue.objects.get(title='Fancy task').tags.count(), 1)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)

        # same for user
        Issue.objects.get(title='Fancy task').assignee.clear()
        user3 = get_user_model().objects.create_user('jj', 'x', 'x')
        self.project.developer.add(user3)
        user4 = get_user_model().objects.create_user('jjj', 'y', 'y')
        self.project.developer.add(user4)
        user5 = get_user_model().objects.create_user('kj', 'z', 'z')
        self.project.developer.add(user5)
        self.assertRaises(Exception, parser.compile, '>PRJ-1 @j', self.project,
                          self.user)
        self.assertEqual(
            Issue.objects.get(title='Fancy task').assignee.count(), 0)
        parser.compile('>PRJ-1 @jj', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.filter(title='Fancy task', assignee=user3).count(),
            1)
        parser.compile('>PRJ-1 @jjj', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.filter(title='Fancy task', assignee=user4).count(),
            1)

        # user search case insensitive
        Issue.objects.get(title='Fancy task').assignee.clear()
        parser.compile('>PRJ-1 @jJJ', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.filter(title='Fancy task', assignee=user4).count(),
            1)

        # check that setting more than one assignee is possible
        parser.compile('>PRJ-1 @a @jj @kj', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.get(title='Fancy task').assignee.count(), 4)
        parser.compile('>PRJ-1 @jj', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.get(title='Fancy task').assignee.count(), 4)

        # test add depends functionality
        parser.compile('New issue depending on PRJ-1 ~PRJ-1', self.project,
                       self.user)
        self.assertEqual(parser.issue_created, True)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.filter(project=self.project,
                                 title='New issue depending on PRJ-1').count(),
            1)
        self.assertEqual(
            Issue.objects.get(
                project=self.project,
                title='New issue depending on PRJ-1').dependsOn.count(), 1)
        parser.compile('>PRJ-1 ~PRJ-2', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.get(title='Fancy task').dependsOn.count(), 1)

        # tag not existant
        Issue.objects.get(title='Fancy task').tags.clear()
        self.assertRaises(Exception, parser.compile, '>PRJ-1 #imnothere',
                          self.project, self.user)
        self.assertEqual(Issue.objects.get(title='Fancy task').tags.count(), 0)

        # user not existant
        Issue.objects.get(title='Fancy task').assignee.clear()
        self.assertRaises(Exception, parser.compile, '>PRJ-1 @imnothere',
                          self.project, self.user)
        self.assertEqual(
            Issue.objects.get(title='Fancy task').assignee.count(), 0)

        # test omitting project shortname in depends and modify tag
        Issue.objects.get(title='Fancy task').dependsOn.clear()
        parser.compile('>1 ~2', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(
            Issue.objects.get(title='Fancy task').dependsOn.count(), 1)
        self.assertEqual(
            Issue.objects.get(title='Fancy task').dependsOn.first().title,
            'Another fancy task')

        # check permissions test for issue to modify
        user5 = get_user_model().objects.create_user('tt', 'hh', 'ii')
        self.assertNotEqual(Issue.objects.get(title='Fancy task').priority, 4)
        self.assertRaises(Exception, parser.compile, '>1 !4', self.project,
                          user5)
        self.assertNotEqual(Issue.objects.get(title='Fancy task').priority, 4)

        # check that managers and (managers & developers) are valid as assignee
        u_manager = get_user_model().objects.create_user('manager', 'ma', 'ma')
        u_maneloper = get_user_model().objects.create_user(
            'maneloper', 'mar', 'mar')
        self.project.manager.add(u_manager)
        self.project.manager.add(u_maneloper)
        self.project.developer.add(u_maneloper)

        Issue.objects.get(title='Fancy task').assignee.clear()
        parser.compile('>PRJ-1 @manager @maneloper', self.project, self.user)
        self.assertEqual(parser.issue_created, False)
        self.assertEqual(parser.issue_changed, True)
        self.assertEqual(
            Issue.objects.filter(
                Q(title='Fancy task')
                & (Q(assignee=u_manager) | Q(assignee=u_maneloper))).count(),
            2)

        # check that first and last name is also valid when searching for users
        parser.compile('>PRJ-1 @alice @bob', self.project, self.user)
        issue = self.project.issue.get(number=1)
        self.assertIn(self.user, issue.assignee.all())
        self.assertIn(self.user2, issue.assignee.all())
        self.assertIn(u_manager, issue.assignee.all())
        self.assertIn(u_maneloper, issue.assignee.all())
        self.assertEqual(issue.assignee.count(), 4)
        parser.compile('>PRJ-1 @alice @Blub', self.project, self.user)
        issue.refresh_from_db()
        self.assertIn(self.user, issue.assignee.all())
        self.assertIn(self.user2, issue.assignee.all())
        self.assertIn(u_manager, issue.assignee.all())
        self.assertIn(u_maneloper, issue.assignee.all())
        self.assertEqual(issue.assignee.count(), 4)

        # check that user is not assigned more than once
        Issue.objects.get(title='Fancy task').assignee.clear()
        parser.compile('>PRJ-1 @alice @Bla', self.project, self.user)
        issue.refresh_from_db()
        self.assertIn(self.user, issue.assignee.all())
        self.assertEqual(issue.assignee.count(), 1)

        # check that no issue is created with error in change expression
        self.project.refresh_from_db()
        currentID = self.project.nextTicketId
        currentTicketCount = self.project.issue.count()
        self.assertRaises(Exception, parser.compile,
                          'New Issue #nonexistanttag', self.project, self.user)
        self.project.refresh_from_db()
        self.assertEqual(currentID, self.project.nextTicketId)
        self.assertEqual(currentTicketCount, self.project.issue.count())

        # check that issue creation without change expression is possible
        self.project.refresh_from_db()
        currentID = self.project.nextTicketId
        currentTicketCount = self.project.issue.count()
        title = 'Fancy new issue without chgxpr'
        parser.compile(title, self.project, self.user)
        self.assertEqual(parser.issue_created, True)
        self.assertEqual(parser.issue_changed, False)
        self.project.refresh_from_db()
        self.assertEqual(self.project.issue.filter(title=title).count(), 1)
        self.assertEqual(currentID + 1, self.project.nextTicketId)
        self.assertEqual(currentTicketCount + 1, self.project.issue.count())

        # check that changing an issue without change expression throws an exception
        self.assertRaises(Exception, parser.compile, '>1', self.project,
                          self.user)
示例#30
0
def steam(request):

    Steam.objects.all().delete()
    Developer.objects.all().delete()
    Tag.objects.all().delete()
    Genre.objects.all().delete()

    pages = [
        2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
    ]
    pagebreak = 0
    for page in pages:
        if pagebreak == 3:
            break
        ++pagebreak
        session = requests.Session()
        session.headers = {
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36"
        }
        url = 'https://store.steampowered.com/search/?os=win&filter=topsellers&page=' + format(
            page)

        content = session.get(url, verify=False).content

        soup = BeautifulSoup(content, "html.parser")
        topseller = soup.find('div', {'id': 'search_resultsRows'})
        steam = topseller.find_all('a')

        for i in steam:

            link = i['href']
            print(link)

            session = requests.Session()
            session.headers = {
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36"
            }
            url = link
            content = session.get(url, verify=False).content

            soup = BeautifulSoup(content, "html.parser")

            tags_list = list()

            try:
                metascore = soup.find('meta',
                                      {'itemprop': 'ratingValue'})['content']
                print(metascore)
                title = soup.find('div', {'class': 'apphub_AppName'}).text
                print(title)
                genre = soup.find('div', {'class': 'details_block'}).a.text
                print(genre)
                developer = soup.find('div', {'class': 'dev_row'}).a.text
                print(developer)
                price = soup.find('div', {'class': 'game_purchase_price'}).text
                newprice = price.strip()

                if newprice == 'Free to Play':
                    finalprice = 00.00

                else:
                    finalprice = (Decimal(newprice.strip('RM')))

                print(finalprice)

                image = soup.find('img',
                                  {'class': 'game_header_image_full'})['src']
                media_root = '/FYP/django/rise/media'
                if not image.startswith(("data:image", "javascript")):
                    #local_filename = image.split('/')[-1].split("?")[0]
                    local_filename = title + '.jpg'
                    r = session.get(image, stream=True, verify=False)
                    with open(local_filename, 'wb') as f:
                        for chunk in r.iter_content(chunk_size=1024):
                            f.write(chunk)

                    current_image_absolute_path = os.path.abspath(
                        local_filename)
                    shutil.move(current_image_absolute_path, media_root)

                tags = soup.find_all('a', {'class': 'app_tag'})

                for i in tags[0:5]:
                    tag = i.string.strip()
                    print(tag)

                    new_tag = Tag()
                    new_tag.name = tag
                    #new_tag.save()

                    if Tag.objects.filter(name=tag).count() < 1:
                        new_tag.save()

                    new_tag = Tag.objects.get(name=tag)

                    tags_list.append(new_tag)

                print(local_filename)

                new_genre = Genre()
                new_genre.name = genre
                #new_genre.save()

                if Genre.objects.filter(name=genre).count() < 1:
                    new_genre.save()

                new_genre = Genre.objects.get(name=genre)

                new_developer = Developer()
                new_developer.name = developer
                #new_developer.save()

                if Developer.objects.filter(name=developer).count() < 1:
                    new_developer.save()

                new_developer = Developer.objects.get(name=developer)

                new_steam = Steam()
                new_steam.gametitle = title
                new_steam.genre = new_genre
                new_steam.developer = new_developer
                new_steam.price = finalprice
                new_steam.url = link
                new_steam.rating = metascore
                new_steam.image = local_filename
                new_steam.save()

                for tag in tags_list:
                    new_steam.tags.add(tag)

                for row in Steam.objects.all():
                    if Steam.objects.filter(
                            gametitle=row.gametitle).count() > 1:
                        row.delete()

            except:
                pass

    context = {'steams': Steam.objects.all()}

    return render(request, 'steam/gamelist.html', context)
    """