|
4 | 4 |
|
5 | 5 | import aiofiles |
6 | 6 | import aiofiles.os |
| 7 | +from auth_lib.fastapi import UnionAuth |
7 | 8 | from fastapi import APIRouter, File, UploadFile |
8 | 9 | from fastapi.exceptions import HTTPException |
9 | 10 | from fastapi.params import Depends |
@@ -59,11 +60,13 @@ def validate_pages(cls, value: str): |
59 | 60 |
|
60 | 61 |
|
61 | 62 | class SendInput(BaseModel): |
62 | | - surname: str = Field( |
| 63 | + surname: str | None = Field( |
| 64 | + default=None, |
63 | 65 | description='Фамилия', |
64 | 66 | example='Иванов', |
65 | 67 | ) |
66 | | - number: str = Field( |
| 68 | + number: str | None = Field( |
| 69 | + default=None, |
67 | 70 | description='Номер профсоюзного или студенческого билетов', |
68 | 71 | example='1015000', |
69 | 72 | ) |
@@ -107,22 +110,35 @@ class ReceiveOutput(BaseModel): |
107 | 110 | }, |
108 | 111 | response_model=SendOutput, |
109 | 112 | ) |
110 | | -async def send(inp: SendInput, settings: Settings = Depends(get_settings)): |
| 113 | +async def send( |
| 114 | + inp: SendInput, |
| 115 | + user_auth=Depends(UnionAuth(allow_none=True)), |
| 116 | + settings: Settings = Depends(get_settings), |
| 117 | +): |
111 | 118 | """Получить пин код для загрузки и скачивания файла. |
112 | 119 |
|
113 | 120 | Полученный пин-код можно использовать в методах POST и GET `/file/{pin}`. |
114 | 121 | """ |
115 | 122 | user = db.session.query(UnionMember) |
116 | 123 | if not settings.ALLOW_STUDENT_NUMBER: |
117 | 124 | user = user.filter(UnionMember.union_number != None) |
118 | | - user = user.filter( |
119 | | - or_( |
120 | | - func.upper(UnionMember.student_number) == inp.number.upper(), |
121 | | - func.upper(UnionMember.union_number) == inp.number.upper(), |
122 | | - ), |
123 | | - func.upper(UnionMember.surname) == inp.surname.upper(), |
124 | | - ).one_or_none() |
125 | | - if not user: |
| 125 | + |
| 126 | + if (inp.number is not None) and (inp.surname is not None): |
| 127 | + user = user.filter( |
| 128 | + or_( |
| 129 | + func.upper(UnionMember.student_number) == inp.number.upper(), |
| 130 | + func.upper(UnionMember.union_number) == inp.number.upper(), |
| 131 | + ), |
| 132 | + func.upper(UnionMember.surname) == inp.surname.upper(), |
| 133 | + ) |
| 134 | + |
| 135 | + else: |
| 136 | + if not "print.file.send" in [scope["name"] for scope in user_auth.get('session_scopes')]: |
| 137 | + raise NotInUnion() |
| 138 | + |
| 139 | + user = user.one_or_none() |
| 140 | + |
| 141 | + if user is None: |
126 | 142 | raise NotInUnion() |
127 | 143 | try: |
128 | 144 | pin = generate_pin(db.session) |
|
0 commit comments