Beispiel #1
0
 def test_fetch_story(self):
     dog: Dog = fetch_dog('id_public_1')
     self.assertIsNone(fetch_story(dog))
     create_story(dog)
     self.assertIsNotNone(fetch_story(dog))
     self.assertIsNone(fetch_story(fetch_dog('id_public_2')))
     fetch_story(dog).delete()
     self.assertIsNone(fetch_story(dog))
Beispiel #2
0
def render_cancel_story(request: HttpRequest,
                        dog_id: str = '') -> HttpResponse:
    account: Optional[Account] = fetch_account(request)
    dog: Optional[Dog] = fetch_dog(dog_id)
    if account is None:
        return render_error(request, "Account not found.")
    if dog is None:
        return render_error(request, "Dog not found.")
    if not dog.is_owner(account):
        return render_error(request, "This doggo is not yours!")
    story: Optional[Story] = fetch_story(dog)
    if story is None:
        return render_error(request, "Story not found.")
    story.delete()
    return redirect(reverse('dog', kwargs={'id': dog.id_public}))
Beispiel #3
0
def render_story_choice(request: HttpRequest,
                        dog_id: str = '',
                        choice_id: str = '') -> HttpResponse:
    """
    TODO add security check that the account is the owner
    :param request:
    :param dog_id:
    :param choice_id:
    :return:
    """
    account: Optional[Account] = fetch_account(request)
    dog: Optional[Dog] = fetch_dog(dog_id)
    if account is None:
        return render_error(request, "Account not found.")
    if dog is None:
        return render_error(request, "Dog not found.")
    if not dog.is_owner(account):
        return render_error(request, "This doggo is not yours!")
    story: Optional[Story] = fetch_story(dog)
    if story is None:
        return render_error(request, "Story not found.")
    apply_story_choice(story, choice_id, account, dog)
    return redirect(reverse('dog', kwargs={'id': dog.id_public}))
Beispiel #4
0
def display_dog(request: HttpRequest, dog: Dog, account: Account,
                now: datetime) -> HttpResponse:
    left_dog: Optional[Dog] = None
    right_dog: Optional[Dog] = None
    is_current_owner: bool = dog.is_owner(account)
    if is_current_owner:
        story: Optional[Story] = fetch_story(dog=dog)
        if story is None:
            dogs: List[Dog] = fetch_dogs(account.id, now, False)
            current_dog_index: int = dogs.index(dog)
            left_dog = list_get_or_none(dogs, current_dog_index - 1)
            right_dog = list_get_or_none(dogs, current_dog_index + 1)
        else:
            return display_story(request, dog, account, story)
    dog_action_events: List[DogActionEvent] = get_last_dog_action_events(dog)
    return render(request,
                  'dog.html',
                  context={
                      'account':
                      account,
                      'dog':
                      dog,
                      'dog_age':
                      dog.age(now),
                      'DogStatus':
                      DogStatus,
                      'is_current_owner':
                      is_current_owner,
                      'extended_description_status':
                      dog.extended_description_status(now),
                      'left_dog':
                      left_dog,
                      'right_dog':
                      right_dog,
                      'formatted_dog_action_events':
                      list(map(render_dog_action_event, dog_action_events))
                  })
Beispiel #5
0
 def test_create_story(self):
     dog: Dog = fetch_dog('id_public_1')
     create_story(dog)
     story: Story = fetch_story(dog)
     self.assertEquals(story.state, START_WALK_NODE)
     self.assertEquals(story.dog.id, dog.id)
Beispiel #6
0
def action_allowed(dog: Dog, account: Account) -> bool:
    return dog.status == DogStatus.AVAILABLE and dog.is_owner(
        account) and fetch_story(dog) is None