Skip to content

Commit a79f35d

Browse files
committed
moving django dependencies apart from the rest of the extra fields
1 parent 708403e commit a79f35d

File tree

3 files changed

+78
-83
lines changed

3 files changed

+78
-83
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import os
2+
import datetime
3+
4+
from mongoengine.base import BaseField
5+
from mongoengine.python_support import str_types
6+
7+
from django.db.models.fields.files import FieldFile
8+
from django.core.files.base import File
9+
from django.core.files.storage import default_storage
10+
11+
from django.utils.encoding import force_str, force_text
12+
13+
14+
class LocalStorageFileField(BaseField):
15+
16+
proxy_class = FieldFile
17+
18+
def __init__(self,
19+
size=None,
20+
name=None,
21+
upload_to='',
22+
storage=None,
23+
**kwargs):
24+
self.size = size
25+
self.storage = storage or default_storage
26+
self.upload_to = upload_to
27+
if callable(upload_to):
28+
self.generate_filename = upload_to
29+
super(LocalStorageFileField, self).__init__(**kwargs)
30+
31+
def __get__(self, instance, owner):
32+
if instance is None:
33+
return self
34+
35+
file = instance._data.get(self.name)
36+
37+
if isinstance(file, str_types) or file is None:
38+
attr = self.proxy_class(instance, self, file)
39+
instance._data[self.name] = attr
40+
41+
return instance._data[self.name]
42+
43+
def __set__(self, instance, value):
44+
key = self.name
45+
if isinstance(value, File) and not isinstance(value, FieldFile):
46+
file = instance._data.get(self.name)
47+
if file:
48+
try:
49+
file.delete()
50+
except:
51+
pass
52+
# Create a new proxy object as we don't already have one
53+
file_copy = self.proxy_class(instance, self, value.name)
54+
file_copy.file = value
55+
instance._data[key] = file_copy
56+
else:
57+
instance._data[key] = value
58+
59+
instance._mark_as_changed(key)
60+
61+
def get_directory_name(self):
62+
return os.path.normpath(force_text(
63+
datetime.datetime.now().strftime(force_str(self.upload_to))))
64+
65+
def get_filename(self, filename):
66+
return os.path.normpath(
67+
self.storage.get_valid_name(os.path.basename(filename)))
68+
69+
def generate_filename(self, instance, filename):
70+
return os.path.join(
71+
self.get_directory_name(), self.get_filename(filename))
72+
73+
def to_mongo(self, value):
74+
if isinstance(value, self.proxy_class):
75+
return value.name
76+
return value

extras_mongoengine/fields.py

100755100644
Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,6 @@
22
from mongoengine.base import BaseField
33
from mongoengine.fields import IntField, StringField, EmailField
44

5-
import os
6-
import datetime
7-
8-
from mongoengine.python_support import str_types
9-
from django.db.models.fields.files import FieldFile
10-
from django.core.files.base import File
11-
from django.core.files.storage import default_storage
12-
13-
from django.utils.encoding import force_str, force_text
14-
155

166
class TimedeltaField(BaseField):
177
"""A timedelta field.
@@ -52,71 +42,6 @@ def total_seconds(value):
5242
(value.microseconds / 1000000.0)
5343

5444

55-
class LocalStorageFileField(BaseField):
56-
57-
proxy_class = FieldFile
58-
59-
def __init__(self,
60-
size=None,
61-
name=None,
62-
upload_to='',
63-
storage=None,
64-
**kwargs):
65-
self.size = size
66-
self.storage = storage or default_storage
67-
self.upload_to = upload_to
68-
if callable(upload_to):
69-
self.generate_filename = upload_to
70-
super(LocalStorageFileField, self).__init__(**kwargs)
71-
72-
def __get__(self, instance, owner):
73-
if instance is None:
74-
return self
75-
76-
file = instance._data.get(self.name)
77-
78-
if isinstance(file, str_types) or file is None:
79-
attr = self.proxy_class(instance, self, file)
80-
instance._data[self.name] = attr
81-
82-
return instance._data[self.name]
83-
84-
def __set__(self, instance, value):
85-
key = self.name
86-
if isinstance(value, File) and not isinstance(value, FieldFile):
87-
file = instance._data.get(self.name)
88-
if file:
89-
try:
90-
file.delete()
91-
except:
92-
pass
93-
# Create a new proxy object as we don't already have one
94-
file_copy = self.proxy_class(instance, self, value.name)
95-
file_copy.file = value
96-
instance._data[key] = file_copy
97-
else:
98-
instance._data[key] = value
99-
100-
instance._mark_as_changed(key)
101-
102-
def get_directory_name(self):
103-
return os.path.normpath(force_text(
104-
datetime.datetime.now().strftime(force_str(self.upload_to))))
105-
106-
def get_filename(self, filename):
107-
return os.path.normpath(
108-
self.storage.get_valid_name(os.path.basename(filename)))
109-
110-
def generate_filename(self, instance, filename):
111-
return os.path.join(
112-
self.get_directory_name(), self.get_filename(filename))
113-
114-
def to_mongo(self, value):
115-
if isinstance(value, self.proxy_class):
116-
return value.name
117-
return value
118-
119-
12045
class LowerStringField(StringField):
12146
def __set__(self, instance, value):
12247
value = self.to_python(value)

tests/test_fields.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
try:
22
import unittest2 as unittest
3-
except ImportError:
3+
except ImportError:
44
import unittest
55
from datetime import timedelta
66
from mongoengine import Document, NotUniqueError, ValidationError, connect
77
from mongoengine.connection import get_db
88

9-
from django.conf import settings
10-
settings.configure(
11-
USE_TZ=True,
12-
INSTALLED_APPS=[]
13-
)
14-
15-
from ..extras_mongoengine.fields import TimedeltaField, LowerStringField, LowerEmailField
9+
from extras_mongoengine.fields import TimedeltaField, LowerStringField, LowerEmailField
1610

1711

1812
class OldStyleTimedelta(timedelta):

0 commit comments

Comments
 (0)