settings.py 6.38 KB
Newer Older
1
2
3
4
"""Data Model and General Configuration of Eve.

Check out [the Eve docs for configuration](http://python-eve.org/config.html)
if you are unsure about some of the settings.
5

6
7
8
Our schema requires customized data validation. These validation rules are
implemented in `validation.py`.
Some validation rules are still missing, they are marked with TODO in the
9
schema directly.
10
"""
adietmue's avatar
adietmue committed
11

12
13
14
from os import environ


adietmue's avatar
adietmue committed
15
16
17
# AMIVAPI URL and Admin Group
AMIVAPI_URL = "https://amiv-api.ethz.ch"
ADMIN_GROUP_NAME = 'PVK Admins'
18
19

# DB
20
MONGO_HOST = environ.get('MONGO_HOST', 'localhost')
21
22
23
24
25
MONGO_PORT = 27017
MONGO_USERNAME = 'pvkuser'
MONGO_PASSWORD = 'pvkpass'
MONGO_DBNAME = 'pvk'

26
27
28
# Only JSON, simplifies hooks
XML = False

adietmue's avatar
adietmue committed
29

30
RESOURCE_METHODS = ['GET', 'POST']
adietmue's avatar
adietmue committed
31
32
ITEM_METHODS = ['GET', 'PATCH', 'DELETE']

33

adietmue's avatar
adietmue committed
34
35
# ISO 8601 time format instead of rfc1123
DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
36

adietmue's avatar
adietmue committed
37

38
39
40
41
# More Feedback when creating something: Return all fields
BANDWIDTH_SAVER = False


42
# A schema for required start/end time tuple
43
TIMESPAN_SCHEMA = {
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    'type': 'dict',
    'schema': {
        'start': {
            'type': 'datetime',
            'nullable': False,
            'required': True,
        },
        'end': {
            'type': 'datetime',
            'nullable': False,
            'required': True,
        },
    },
}


60
61
62
63
# Same as Eve, but include 403
STANDARD_ERRORS = [400, 401, 403, 404, 405, 406, 409, 410, 412, 422, 428]


64
65
66
# Resources
DOMAIN = {
    'lectures': {
67
68
69

        'user_methods': ['GET'],

70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
        'schema': {
            'title': {
                'type': 'string',
                'maxlength': 100,
                'unique': True,
                'required': True,
                'nullable': False,
                'empty': False,
            },
            'department': {
                'type': 'string',
                'allowed': ['itet', 'mavt'],
                'required': True,
                'nullable': False,
            },
            'year': {
                'type': 'integer',
                'min': 1,
                'max': 3,
                'required': True
            },
91
92
93
94
95
96
97
98
99
100
101
102
            'assistants': {
                # List of nethz of assistants
                'type': 'list',
                'schema': {
                    'type': 'string',
                    'maxlength': 10,
                    'empty': False,
                    'nullable': False,
                }
                # TODO: Not the same nethz twice
                # TODO: nethz is enough?
            }
103
104
105
106
        },
    },

    'courses': {
107
108
109

        'user_methods': ['GET'],

110
111
112
113
114
115
116
117
        'schema': {
            'lecture': {
                'type': 'objectid',
                'data_relation': {
                    'resource': 'lectures',
                    'field': '_id',
                    'embeddable': True
                },
118
                'not_patchable': True,  # Course is tied to lecture
119
120
            },
            'assistant': {
121
122
                'type': 'string'
                # TODO: Assistant needs to exist for lecture
123
124
            },

125
            'signup': TIMESPAN_SCHEMA,
126
127
128

            'datetimes': {
                'type': 'list',
129
130
                'schema': TIMESPAN_SCHEMA,
                # TODO: Timeslots must not overlap
131
132
133
134
135
136
137
138
            },
            'room': {
                'type': 'string',
                'maxlength': 100,
                'unique': True,
                'required': True,
                'nullable': False,
                'empty': False,
139
                # TODO: Room must be empty for time slot
140
141
142
143
144
145
146
147
148
149
150
            },
            'spots': {
                'type': 'integer',
                'min': 1,
                'required': True,
                'nullable': False
            }
        },
    },

    'signups': {
151
152
        # Signup for a user to a course

153
154
        'user_methods': ['GET', 'POST', 'PATCH', 'DELETE'],

155
156
157
158
159
160
161
        'schema': {
            'nethz': {
                'type': 'string',
                'maxlength': 10,
                'empty': False,
                'nullable': False,
                'required': True,
adietmue's avatar
adietmue committed
162
                'only_own_nethz': True,
163
                'not_patchable': True,  # Signup is tied to user
164
165
166
167
168
169
170
171
            },
            'course': {
                'type': 'objectid',
                'data_relation': {
                    'resource': 'courses',
                    'field': '_id',
                    'embeddable': True
                },
adietmue's avatar
adietmue committed
172
                'unique_combination': ['nethz'],
173
                'required': True,
174
                # TODO: No overlapping courses
175
176
177
            },
            'status': {
                'type': 'string',
178
                'allowed': ['waiting', 'reserved', 'accepted'],
179
                'readonly': True,
180
                'default': 'waiting',
181
182
            },
        },
183
184
185
186
187
188
    },

    'selections': {
        # Easy way for users to safe their selections before signup is open
        # List of selected courses per user

189
190
        'user_methods': ['GET', 'POST', 'PATCH', 'DELETE'],

191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
        'schema': {
            'nethz': {
                'type': 'string',
                'maxlength': 10,
                'empty': False,
                'nullable': False,
                'required': True,
                'only_own_nethz': True,
                'unique': True,
            },
            'courses': {
                'type': 'list',
                'schema': {
                    'type': 'objectid',
                    'data_relation': {
                        'resource': 'courses',
                        'field': '_id',
                        'embeddable': True
                    },
                    # TODO: No duplicate entries
                    # TODO: No entries that are already reserved
                },
            },
        },
    },

    'payments': {
        # Dummy endpoint for payments.
        # TODO: Implement as soon as PSP is known.

221
222
223
        # Only admins can delete payments
        'user_methods': ['GET', 'POST', 'PATCH'],

224
225
226
227
228
229
230
231
232
233
234
        'schema': {
            'signups': {
                'type': 'list',
                'schema': {
                    'type': 'objectid',
                    'data_relation': {
                        'resource': 'signups',
                        'field': '_id',
                        'embeddable': True
                    },
                    # TODO: No duplicate entries
235
                    # TODO: No courses on waiting list
236
237
238
239
240
                },
                'required': True,
                'nullable': False,
            }
        }
241
242
    }
}