Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

""" 

    marvin.views.users 

    ~~~~~~~~~~~~~~~~~~~~ 

 

    CRU endpoints for users. 

 

""" 

# pylint: disable=no-self-use 

 

from .. import db 

from ..models import User, UserForm, UserLoginForm 

from ..permissions import login_required 

from ..security import is_correct_pw 

 

from flask import url_for 

from flask.ext.restful import Resource 

from flask.ext.principal import UserNeed, Permission 

 

class CreateUserView(Resource): 

    """ Create endpoint for users. """ 

 

    def post(self): 

        """ Create new user. """ 

        form = UserForm() 

35        if form.validate_on_submit(): 

            user = User(password=form.password.data) 

            form.populate_obj(user) 

            db.session.add(user) 

            db.session.commit() 

            return { 

                'msg': 'User created', 

                'user': user.to_json(), 

                'auth_token': user.get_auth_token(), 

            }, 201 

        return { 

            'msg': 'Data did not validate.', 

            'errors': form.errors, 

        }, 400 

 

 

class LoginView(Resource): 

    """ Endpoint for creating an auth_token. """ 

 

    def post(self): 

        """ Create new auth_token. """ 

        form = UserLoginForm() 

62        if form.validate_on_submit(): 

            user = (User.query.filter(User.username == form.identifier.data).first() 

                or User.query.filter(User.email == form.identifier.data).first()) 

59            if user: 

59                if is_correct_pw(form.password.data, user.password_hash): 

                    return { 

                        'auth_token': user.get_auth_token(), 

                        'user': { 

                            'href': url_for('userdetailview', user_id=user.id, _external=True), 

                            'username': user.username, 

                        } 

                    } 

            return { 

                'msg': 'Incorrect username or password', 

            }, 401 

        return { 

            'msg': 'Data did not validate', 

            'errors': form.errors, 

        }, 400 

 

 

class UserDetailView(Resource): 

    """ Read endpoint for users. """ 

 

    @login_required 

    def get(self, user_id): 

        """ Get details for a given user. """ 

        personal_details_view = Permission(UserNeed(user_id)) 

        is_self = personal_details_view.can() 

        user = User.query.get_or_404(user_id) 

        return { 

            'user': user.to_json(include_personal_data=is_self), 

        }