#589 closed enhancement (fixed)
A patch that adds FilePathField
| Reported by: | Owned by: | Adrian Holovaty | |
|---|---|---|---|
| Component: | contrib.admin | Version: | |
| Severity: | normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I coded a patch that implements the FilePathField that was discussed at http://www.socialistsoftware.com/?p=12 and http://groups.google.com/group/django-developers/browse_thread/thread/e0d0bd7f303179e8/2fb7e3ff4409175a
The interface works like this:
fieldName = meta.FilePathField(path='/path/to/files', match='re_string', recursive=True)
path is the location of the files you want to choose
match is a string that is put into re.compile(match) so that only filenames that match that re are included in the list
recursive is a boolean which when set to True allows all the files in subdirectories of path to be included in the list
path is the only required parameter.
I am not sure of the correct way to submit patches so you can download it at http://socialistsoftware.com/django/FilePathField.diff
and I have pasted it inline below.
Index: trunk/django/core/meta/fields.py
===================================================================
--- trunk/django/core/meta/fields.py (revision 770)
+++ trunk/django/core/meta/fields.py (working copy)
@@ -427,6 +427,43 @@
f = os.path.join(self.get_directory_name(), get_valid_filename(os.path.basename(filename)))
return os.path.normpath(f)
+class FilePathField(Field):
+ def __init__(self, verbose_name=None, name=None, path='', match='', recursive=False, **kwargs):
+ self.path = path
+ self.match = match
+ self.recursive = recursive
+ Field.__init__(self, verbose_name, name, **kwargs)
+
+ def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False):
+ if self.match != '':
+ import re
+ p = re.compile(self.match)
+ files = os.listdir(self.path)
+ theFileList = []
+ if self.recursive:
+ for root, dirs, files in os.walk(self.path):
+ for f in files:
+ if self.match != '':
+ m = p.match(f)
+ if m:
+ theFileList.append(tuple([ os.path.join(self.path, f), f]))
+ else:
+ theFileList.append(tuple([ os.path.join(self.path, f), f]))
+ else:
+ for f in files:
+ if os.path.isfile(os.path.join(self.path,f)):
+ if self.match != '':
+ m = p.match(f)
+ if m:
+ theFileList.append(tuple([ os.path.join(self.path,f), f]))
+ else:
+ theFileList.append(tuple([ os.path.join(self.path,f), f]))
+ self.choices = tuple(theFileList)
+ return Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel)
+
+ def get_manipulator_field_objs(self):
+ return [formfields.TextField]
+
class FloatField(Field):
empty_strings_allowed = False
def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
Attachments (1)
Change History (3)
by , 20 years ago
| Attachment: | FilePathField.diff added |
|---|
comment:1 by , 20 years ago
| Status: | new → assigned |
|---|
comment:2 by , 20 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
FilePathField patch