1+ from typing import Union
2+
13import requests
24import time
35import magic
4- from django .core .files .uploadedfile import TemporaryUploadedFile
6+ from django .core .files .uploadedfile import TemporaryUploadedFile , InMemoryUploadedFile
57
68from files .exceptions import SelectelUploadError
7- from files .models import UserFile
9+ from files .typings import UserFileInfo
810
911from procollab .settings import (
1012 DEBUG ,
1618
1719
1820class FileAPI :
19- def __init__ (self , file : TemporaryUploadedFile , user ) -> None :
21+ # fixme: looks terrible
22+ def __init__ (
23+ self , file : Union [TemporaryUploadedFile , InMemoryUploadedFile ], user
24+ ) -> None :
2025 self .file = file # it's TemporaryUploadedFile, and it will be
2126 # removed after first .close() call, so we must read this file only once
2227 self .user = user
@@ -29,19 +34,25 @@ def delete(url: str) -> int:
2934 response = requests .delete (url , headers = {"X-Auth-Token" : token })
3035 return response .status_code
3136
32- def upload (self ) -> str :
37+ def upload (self ) -> tuple [ str , UserFileInfo ] :
3338 url = self ._upload_via_selectel_swift ()
34- info = get_file_info (self .file )
35- UserFile .objects .create (
36- user = self .user ,
37- link = url ,
38- name = info ["name" ],
39- size = info ["size" ],
40- extension = info ["extension" ],
41- # mime_type=info["mime_type"],
42- )
39+ info = self .get_file_info (self .file )
4340 self .file_object .close ()
44- return url
41+ return url , info
42+
43+ def get_file_info (
44+ self , file : Union [TemporaryUploadedFile , InMemoryUploadedFile ]
45+ ) -> UserFileInfo :
46+ name , ext = file .name .split ("." )
47+ return UserFileInfo (
48+ size = file .size , name = name , extension = ext , mime_type = self .get_file_mime_type ()
49+ )
50+
51+ def get_file_mime_type (self ):
52+ if isinstance (self .file , InMemoryUploadedFile ):
53+ return magic .from_buffer (self .file_object .read (), mime = True )
54+ else :
55+ return magic .from_file (self .file .temporary_file_path (), mime = True )
4556
4657 def _upload_via_selectel_swift (self ) -> str :
4758 token = self ._get_selectel_swift_token ()
@@ -102,18 +113,3 @@ def _generate_selectel_swift_file_url(self) -> str:
102113 link
103114 + f"{ abs (hash (self .user .email ))} /{ abs (hash (self .file .name ))} _{ abs (hash (time .time ()))} { extension } "
104115 )
105-
106-
107- def get_file_info (file : TemporaryUploadedFile ) -> dict :
108- name , ext = file .name .split ("." )
109-
110- return {
111- "size" : file .size ,
112- "name" : name ,
113- "extension" : ext ,
114- # "mime_type": get_file_mime_type(file),
115- }
116-
117-
118- def get_file_mime_type (file : TemporaryUploadedFile ):
119- return magic .from_file (file .name , mime = True )
0 commit comments