class Image(models.Model): class MediaTypeChoices(Enum): video = 'v' image = 'i' # character in Message.content that will be replaced with this image symbol = models.CharField(null=False, max_length=1) message = models.ForeignKey(Message, models.CASCADE, related_name='message', null=False) img = FileField(upload_to=get_random_path, null=True) preview = FileField(upload_to=get_random_path, null=True) type = models.CharField(null=False, max_length=1, default=MediaTypeChoices.image.value) @property def type_enum(self): return self.MediaTypeChoices(self.type) @type_enum.setter def type_enum(self, p_type): self.type = p_type.value class Meta: unique_together = ('symbol', 'message')
def test_filefield_awss3_storage(self): """ Simulate a FileField with an S3 storage which uses keys rather than folders and names. FileField and Storage shouldn't have any os.path() calls that break the key. """ storage = AWSS3Storage() folder = 'not/a/folder/' f = FileField(upload_to=folder, storage=storage) key = 'my-file-key\\with odd characters' data = ContentFile('test') expected_key = AWSS3Storage.prefix + folder + key # Simulate call to f.save() result_key = f.generate_filename(None, key) self.assertEqual(result_key, expected_key) result_key = storage.save(result_key, data) self.assertEqual(result_key, expected_key) # Repeat test with a callable. def upload_to(instance, filename): # Return a non-normalized path on purpose. return folder + filename f = FileField(upload_to=upload_to, storage=storage) # Simulate call to f.save() result_key = f.generate_filename(None, key) self.assertEqual(result_key, expected_key) result_key = storage.save(result_key, data) self.assertEqual(result_key, expected_key)
def test_filefield_generate_filename_with_upload_to(self): def upload_to(instance, filename): return 'some/folder/' + filename f = FileField(upload_to=upload_to) self.assertEqual(f.generate_filename(None, 'test with space.txt'), os.path.normpath('some/folder/test_with_space.txt'))
def test_filefield_dangerous_filename(self): candidates = ['..', '.', '', '???', '$.$.$'] f = FileField(upload_to='some/folder/') msg = "Could not derive file name from '%s'" for file_name in candidates: with self.subTest(file_name=file_name): with self.assertRaisesMessage(SuspiciousFileOperation, msg % file_name): f.generate_filename(None, file_name)
def test_filefield_generate_filename_with_upload_to(self): def upload_to(instance, filename): return 'some/folder/' + filename f = FileField(upload_to=upload_to) self.assertEqual( f.generate_filename(None, 'test with space.txt'), os.path.normpath('some/folder/test_with_space.txt') )
def test_filefield_generate_filename_upload_to_dangerous_filename(self): def upload_to(instance, filename): return '/tmp/' + filename f = FileField(upload_to=upload_to) candidates = ['..', '.', ''] for file_name in candidates: msg = f"Could not derive file name from '/tmp/{file_name}'" with self.subTest(file_name=file_name): with self.assertRaisesMessage(SuspiciousFileOperation, msg): f.generate_filename(None, file_name)
def test_filefield_generate_filename_absolute_path(self): f = FileField(upload_to='some/folder/') candidates = [ '/tmp/path', '/tmp/../path', ] for file_name in candidates: msg = f"Detected path traversal attempt in '{file_name}'" with self.subTest(file_name=file_name): with self.assertRaisesMessage(SuspiciousFileOperation, msg): f.generate_filename(None, file_name)
def save_or_store_media(file: models.FileField, filename: str): """ Saves FileField filename as relative path if it's under MEDIA_ROOT. Otherwise writes file under media root. """ if is_media_full_path(filename): file.name = strip_media_root(filename) # type: ignore else: with open(filename, "rb") as fp: plain_filename = os.path.basename(filename) file.save(plain_filename, File(fp)) # type: ignore # noqa
def file( *args, **kwargs ): meta = _kwargs_( kwargs ) meta['type'] = 'float' field = FileField( *args, **kwargs ) field.meta = meta return field
def test_filefield_get_filename_deprecation(self): with warnings.catch_warnings(record=True) as warns: warnings.simplefilter('always') f = FileField(upload_to='some/folder/') self.assertEqual(f.get_filename('some/folder/test.txt'), 'test.txt') self.assertEqual(len(warns), 1) self.assertEqual( warns[0].message.args[0], 'FileField now delegates file name and folder processing to the ' 'storage. get_filename() will be removed in Django 2.0.')
def test_filefield_get_filename_deprecation(self): with warnings.catch_warnings(record=True) as warns: warnings.simplefilter('always') f = FileField(upload_to='some/folder/') self.assertEqual(f.get_filename('some/folder/test.txt'), 'test.txt') self.assertEqual(len(warns), 1) self.assertEqual( warns[0].message.args[0], 'FileField now delegates file name and folder processing to the ' 'storage. get_filename() will be removed in Django 2.0.' )
class PipelineJob(Model): """Represents job to be run on the original LexMapr pipeline.""" id = CharField(max_length=128, primary_key=True) complete = BooleanField(default=False) input_file = FileField(upload_to="input_files/", blank=True) output_file = FileField(upload_to="output_files/", blank=True) expires = DateTimeField(default=get_expiry_date) err = BooleanField(default=False) err_msg = TextField(blank=True) def get_absolute_url(self): return reverse('pipeline:temp', kwargs={"job_id": self.id})
def test_filefield_get_directory_deprecation(self): with warnings.catch_warnings(record=True) as warns: warnings.simplefilter('always') f = FileField(upload_to='some/folder/') self.assertEqual(f.get_directory_name(), os.path.normpath('some/folder/')) self.assertEqual(len(warns), 1) self.assertEqual( warns[0].message.args[0], 'FileField now delegates file name and folder processing to the ' 'storage. get_directory_name() will be removed in LegionMarket 2.0.' )
def test_filefield_dangerous_filename(self): candidates = [ ('..', 'some/folder/..'), ('.', 'some/folder/.'), ('', 'some/folder/'), ('???', '???'), ('$.$.$', '$.$.$'), ] f = FileField(upload_to='some/folder/') for file_name, msg_file_name in candidates: msg = f"Could not derive file name from '{msg_file_name}'" with self.subTest(file_name=file_name): with self.assertRaisesMessage(SuspiciousFileOperation, msg): f.generate_filename(None, file_name)
def test_filefield_dangerous_filename(self): candidates = [ ("..", "some/folder/.."), (".", "some/folder/."), ("", "some/folder/"), ("???", "???"), ("$.$.$", "$.$.$"), ] f = FileField(upload_to="some/folder/") for file_name, msg_file_name in candidates: msg = f"Could not derive file name from '{msg_file_name}'" with self.subTest(file_name=file_name): with self.assertRaisesMessage(SuspiciousFileOperation, msg): f.generate_filename(None, file_name)
class UserProfile(User): name = CharField(max_length=30, null=True, blank=True) surname = CharField(max_length=30, null=True, blank=True) facebook_id = CharField(max_length=30, null=True, blank=True, unique=True) google_id = CharField(max_length=190, null=True, blank=True, unique=True) # tho email max length is 254 characted mysql supports unique keys only 767 bytes long (utf8 4 bytes = 767/4 = 191) email = EmailField(null=True, unique=True, blank=True, max_length=190) city = CharField(max_length=50, null=True, blank=True) birthday = DateField(null=True, blank=True) contacts = CharField(max_length=100, null=True, blank=True) # fileField + <img instead of ImageField (removes preview link) photo = FileField(upload_to=get_random_path, null=True, blank=True) suggestions = BooleanField(null=False, default=True) show_when_i_typing = BooleanField(null=False, default=True) embedded_youtube = BooleanField(null=False, default=True) highlight_code = BooleanField(null=False, default=False) logs = CharField(max_length=16, null=False, blank=False, default=JS_CONSOLE_LOGS) theme = CharField(max_length=16, null=False, default='color-reg') online_change_sound = BooleanField(null=False, default=True) incoming_file_call_sound = BooleanField(null=False, default=True) message_sound = BooleanField(null=False, default=True) send_logs = BooleanField(null=False, default=True) email_verification = ForeignKey(Verification, CASCADE, null=True, blank=True) def save(self, *args, **kwargs): """ http://stackoverflow.com/questions/15422606/django-model-email-field-unique-if-not-null-blank """ if self.email is not None: self.email.lower().strip() # Hopefully reduces junk to "" if self.email == "": self.email = None super(UserProfile, self).save(*args, **kwargs)
class PaperVersion(Model): paper = ForeignKey(Paper, null=True) title = CharField(max_length=1024) contents = FileField(upload_to='papers') abstract = TextField() time = DateTimeField(auto_now_add=True) class Meta: db_table = 'paper_versions' @staticmethod @label_for('paper', 'title', 'contents', 'abstract') @jeeves def jeeves_restrict_paperversionlabel(pv, ctxt): if pv == None or pv.paper == None: return False if PaperPCConflict.objects.get(paper=pv.paper, pc=ctxt) != None: return False return (pv.paper != None and pv.paper.author == ctxt) or ctxt.level == 'pc' or ctxt.level == 'chair' @staticmethod def jeeves_get_private_paper(pv): return None @staticmethod def jeeves_get_private_title(pv): return "" @staticmethod def jeeves_get_private_contents(pv): return "" @staticmethod def jeeves_get_private_abstract(pv): return ""
class SaveFile(CoreModel): name = CharField(max_length=128, verbose_name="文件名称", null=True, blank=True) type = CharField(max_length=200, verbose_name="文件类型", null=True, blank=True) size = CharField(max_length=64, verbose_name="文件大小", null=True, blank=True) address = CharField(max_length=16, verbose_name="存储位置", null=True, blank=True) # 本地、阿里云、腾讯云.. source = CharField(max_length=16, verbose_name="文件来源", null=True, blank=True) # 导出、用户上传. oss_url = CharField(max_length=200, verbose_name="OSS地址", null=True, blank=True) status = BooleanField(default=True, verbose_name="文件是否存在") file = FileField( verbose_name="文件URL", upload_to=files_path, ) class Meta: verbose_name = '文件管理' verbose_name_plural = verbose_name def __str__(self): return f"{self.name}"
class Issue(Model): title = CharField(max_length=255) file = FileField(upload_to='issues/%Y/%m') img = ImageField(upload_to='images/%Y/%m') volume = PositiveIntegerField(null=True) issue = PositiveIntegerField(null=True) date = DateTimeField()
class Resume(Model): id = AutoField(primary_key=True) title = CharField(max_length=255, null=False) author = ForeignKey(User, related_name='user') raw = FileField() createdAt = DateTimeField(auto_now_add=True)
class Epoch(Model): name = CharField(max_length=35) upload = FileField() def __str__(self): return self.name
class Fee(Model): IND = 0 ORG = 1 STD = 2 MEMBER_FEES = ( (IND, 100), (ORG, 400), (STD, 25), ) member = ForeignKey(Member) paid = BooleanField() year = CharField(max_length=4) paid_date = DateField() invoice = FileField(upload_to=rename_invoice) def __unicode__(self): p = self.paid and ' - payed (' + self.paid_date + ')' or '' o = '' if self.member.member_type == 1: # organisation o += self.member.organisation + ' - head-of-list: ' return self.member.member_id + ' (' + o + self.member.firstname + ' ' + unicode.upper( self.member.lastname) + ') - ' + self.year + p class Meta: unique_together = ( 'member', 'paid', 'year', )
class Game(Model): """docstring for Request""" name = CharField(max_length=255, ) description = TextField(blank=True, null=True) created_date = DateTimeField(default=timezone.now()) image = ImageField(upload_to="pic_folder/imgs/", blank=True, null=True) min_players = IntegerField(default=1) max_players = IntegerField(default=100) manual = FileField(upload_to="file_folder/manual", blank=True, null=True) min_best_for = IntegerField(default=0) max_best_for = IntegerField(default=100) difficulty_level = CharField(max_length=25, choices=( ('very_easy', 'muito fácil'), ('easy', 'facil'), ('normal', 'normal'), ('hard', 'difícil'), ('very_hard', 'muito difícil'), )) time = IntegerField(default=0) def __str__(self): return self.name def no_space_name(self): return self.name.replace(' ', '-') def mechanisms(self): return GameXGameMechanism.objects.filter(game=self)
class BuilderFile(Model): create_time = DateTimeField(auto_now_add=True, verbose_name=_("Create Time")) user = ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=CASCADE, related_name="surveys18_files", verbose_name=_("User"), ) token = TextField(null=True, blank=True, verbose_name=_("Token String")) datafile = FileField( null=True, blank=True, upload_to="surveys18/builders/", verbose_name=_("DataFile"), ) type = ForeignKey( "surveys18.BuilderFileType", null=True, blank=True, on_delete=CASCADE, verbose_name=_("BuilderFileType"), ) class Meta: verbose_name = _("BuilderFile") verbose_name_plural = _("BuilderFile") def __str__(self): return str(self.type) def __unicode__(self): return str(self.type)
class Article(models.Model): title = CharField(max_length=128) article = FileField(upload_to=md_file_path) post_date = DateTimeField(default=timezone.now) #スペース区切りのカテゴリー category_split_space = CharField(max_length=128) category = ManyToManyField(Category)
class ResourceCache(Model): def __str__(self): return u"{}: {}".format(self.format, self.file) file = FileField(upload_to='caches') format = CharField(max_length=16, choices=CACHE_FORMATS) resources = ManyToManyField('Resource')
class BuilderFile(Model): create_time = DateTimeField(auto_now_add=True, verbose_name=_("Create Time")) user = ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=CASCADE, related_name="surveys20_files", verbose_name=_("User"), ) token = TextField(null=True, blank=True, verbose_name=_("Token String")) datafile = FileField( null=True, blank=True, upload_to="surveys20/builders/", verbose_name=_("DataFile"), ) delete_exist = BooleanField(default=False) class Meta: verbose_name = _("BuilderFile") verbose_name_plural = _("BuilderFile") def __str__(self): return str(self.user)
class Outcome(Model): study = ForeignKey(Study, related_name='outcomes') type_of_outcome = ForeignKey('TypeOfOutcome', verbose_name='type of output', null=True, blank=True) content_topic = ForeignKey('ContentTopic', verbose_name='content topic', null=True, blank=True) document_title = CharField('title', max_length=255) text = TextField('text', null=True, blank=True) file_id = FileField(upload_to='outcomes', max_length=256, null=True, blank=True, default='', verbose_name='File') def __unicode__(self): return self.document_title
def test_filefield_generate_filename_upload_to_absolute_path(self): def upload_to(instance, filename): return '/tmp/' + filename f = FileField(upload_to=upload_to) candidates = [ 'path', '../path', '???', '$.$.$', ] for file_name in candidates: msg = f"Detected path traversal attempt in '/tmp/{file_name}'" with self.subTest(file_name=file_name): with self.assertRaisesMessage(SuspiciousFileOperation, msg): f.generate_filename(None, file_name)
class Product(Model): name = CharField(max_length=64) description = CharField(max_length=256) photo = FileField(null=True, blank=True, default="/static/images/product.png") stall = ForeignKey(Stall, on_delete=CASCADE) quantity = PositiveIntegerField(default=0) is_active = BooleanField(default=True) def deactivate(self): if self.is_active: self.is_active = False self.save() @property def current_price_history(self): return self.pricehistory_set.all().order_by('-effective_from')[0] @property def current_price(self): return self.current_price_history.price def change_price(self, new_price): current_price_history = self.current_price_history current_price_history.effective_to = datetime.now() current_price_history.save() self.pricehistory_set.create(price=new_price) def price_for_date(self, date): # Cut off all that are not within parameter date range and sort descending (present to past) price_histories = self.pricehistory_set.filter(effective_from__lte=date).order_by("-effective_from") # Take most recent entry return price_histories[0].price def __str__(self): return f"{self.name}" if self.is_active else f"DEACTIVATED - {self.name}"
class Resource(Model): def __str__(self): return u"{}: {}".format(self.relative_url, self.file) question = ForeignKey('Question', on_delete=CASCADE) relative_url = CharField(max_length=255) file = FileField(null=True, upload_to='resources') resource_type = CharField(max_length=255) mimetype = CharField(max_length=255) data = BinaryField(null=True) part_of_solution = BooleanField(default=False) def url(self): return self.file.url def as_bytes(self): s = bytes() if self.file: self.file.open() s = self.file.read() self.file.close() elif self.data is not None: fname = os.path.join('resources', self.question.identifier, self.relative_url) self.file.name = fname ensure_dir_exists(self.file.path) with open(self.file.path, 'wb') as f: f.write(self.data) s = self.data return s def as_base64(self): return base64.b64encode(self.as_bytes())
class TestModelFields(Model): big_int = BigIntegerField() yesno = BooleanField() title = CharField(max_length=150) csv_data = CommaSeparatedIntegerField(max_length=255) when = DateField() when_accurate = DateTimeField() amount = DecimalField(max_digits=8, decimal_places=4) email = EmailField() upload = FileField(upload_to='test') path = FilePathField(path=d.APP_DIR, recursive=False, match=".json$") inaccurate = FloatField() img = ImageField(upload_to='test') ip = IPAddressField() better_ip = GenericIPAddressField(protocol='both') yesnomaybe = NullBooleanField(default=None) posint = PositiveIntegerField() small_posint = PositiveSmallIntegerField() slug = SlugField() small_int = SmallIntegerField() content = TextField() when_time = TimeField() web_address = URLField() user = ForeignKey('auth.User') groups = ManyToManyField('auth.Group') one_to_one = OneToOneField('auth.Permission') class Meta: verbose_name = 'test model fields' verbose_name_plural = 'test model fields'
class FormFromModelTest(Model): f_int = IntegerField() f_float = FloatField() f_bool = BooleanField() f_file = FileField() f_int_excluded = IntegerField()
def __init__(self, *args, **kwargs): FileField.__init__(self) self.content_types = '' #kwargs.pop("content_types") self.max_upload_size = 20971520 #kwargs.pop("max_upload_size") super(AudioField, self).__init__(*args, **kwargs)
def test_filefield_generate_filename(self): f = FileField(upload_to='some/folder/') self.assertEqual( f.generate_filename(None, 'test with space.txt'), os.path.normpath('some/folder/test_with_space.txt') )