Mercurial > agora
annotate apps/bundle/models.py @ 209:4033ebe1867f
Add ability to download files
This makes use of a new model (BundleVersion) to keep track of the
locations on disk of the original uploads for each version. This will
require some manual processing to get it working for existing bundles,
since the information needed isn't being stored at the moment.
author | dellsystem <ilostwaldo@gmail.com> |
---|---|
date | Sun, 17 Feb 2013 14:57:39 -0500 |
parents | 1eb652aa501a |
children |
rev | line source |
---|---|
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
1 import os |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
2 |
2
3cef0d445036
Start actual app structure
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
diff
changeset
|
3 from django.db import models |
3 | 4 from django.contrib.auth.models import User |
171
a57d15b044a7
Add help_text to name field for bundles
dellsystem <ilostwaldo@gmail.com>
parents:
151
diff
changeset
|
5 from django.utils.translation import ugettext_lazy as _ |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
6 from pygments import lexers, highlight, formatters, util |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
7 from mptt.models import MPTTModel, TreeForeignKey |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
8 from sizefield.models import FileSizeField |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
9 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
10 from apps.free_license.models import FreeLicense |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
11 from apps.snippet.highlight import NakedHtmlFormatter |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
12 |
2
3cef0d445036
Start actual app structure
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
diff
changeset
|
13 |
3 | 14 class Bundle(models.Model): |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
15 class Meta: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
16 # Every user must pick unique names for their bundles |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
17 unique_together = ('uploader','name') |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
18 ordering = ['-pub_date'] |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
19 |
171
a57d15b044a7
Add help_text to name field for bundles
dellsystem <ilostwaldo@gmail.com>
parents:
151
diff
changeset
|
20 name = models.SlugField(help_text=_("Your bundle will be accessible " + |
a57d15b044a7
Add help_text to name field for bundles
dellsystem <ilostwaldo@gmail.com>
parents:
151
diff
changeset
|
21 "from a URL that uses the name you enter here, so choose wisely. " + |
a57d15b044a7
Add help_text to name field for bundles
dellsystem <ilostwaldo@gmail.com>
parents:
151
diff
changeset
|
22 "Acceptable characters: alphanumeric characters, hyphens, and " + |
a57d15b044a7
Add help_text to name field for bundles
dellsystem <ilostwaldo@gmail.com>
parents:
151
diff
changeset
|
23 "underscores.")) |
3 | 24 uploader = models.ForeignKey(User) |
187
4752861906b3
Added help_text to bundle description field
dellsystem <ilostwaldo@gmail.com>
parents:
184
diff
changeset
|
25 description = models.TextField(blank=True, null=True, help_text=_( |
4752861906b3
Added help_text to bundle description field
dellsystem <ilostwaldo@gmail.com>
parents:
184
diff
changeset
|
26 "Optional. If this field is left empty and the checkbox below " |
4752861906b3
Added help_text to bundle description field
dellsystem <ilostwaldo@gmail.com>
parents:
184
diff
changeset
|
27 "is ticked, then the DESCRIPTION file (if it exists) will be " |
4752861906b3
Added help_text to bundle description field
dellsystem <ilostwaldo@gmail.com>
parents:
184
diff
changeset
|
28 "used as the bundle description instead.")) |
188
1eb652aa501a
Use ugettext for octave_format help_text (bundle)
dellsystem <ilostwaldo@gmail.com>
parents:
187
diff
changeset
|
29 octave_format = models.BooleanField(_("Is the bundle formatted according" |
1eb652aa501a
Use ugettext for octave_format help_text (bundle)
dellsystem <ilostwaldo@gmail.com>
parents:
187
diff
changeset
|
30 " to Octave package manager standards?"), default=False) |
184
b711f0087709
Use DESCRIPTION file for bundles (SCHEMA CHANGE)
dellsystem <ilostwaldo@gmail.com>
parents:
177
diff
changeset
|
31 # If octave_format is true and there is a DESCRIPTION file in the root |
b711f0087709
Use DESCRIPTION file for bundles (SCHEMA CHANGE)
dellsystem <ilostwaldo@gmail.com>
parents:
177
diff
changeset
|
32 description_file = models.ForeignKey('BundleFile', blank=True, null=True, |
b711f0087709
Use DESCRIPTION file for bundles (SCHEMA CHANGE)
dellsystem <ilostwaldo@gmail.com>
parents:
177
diff
changeset
|
33 related_name="described") |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
34 free_license = models.ForeignKey(FreeLicense, default=1) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
35 pub_date = models.DateTimeField('date uploaded', auto_now_add=True) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
36 mod_date = models.DateTimeField('date last modified', auto_now=True) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
37 done_uploading = models.BooleanField(default=False) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
38 file_name = models.CharField(max_length=256) # the uploaded file |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
39 latest_version = models.IntegerField(default=1) |
6
c83460992637
Elaborate on stub bundle template
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
4
diff
changeset
|
40 |
3 | 41 def __unicode__(self): |
42 return self.name | |
43 | |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
44 @models.permalink |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
45 def get_absolute_url(self): |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
46 return ('bundle_details', [self.uploader.username, self.name]) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
47 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
48 def get_temp_path(self): |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
49 """ |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
50 Returns the path to where the file is initially uploaded |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
51 """ |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
52 return os.path.join('tmp', 'bundles', |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
53 "%d_%d" % (self.id, self.latest_version)) |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
54 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
55 |
209
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
56 class BundleVersion(models.Model): |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
57 class Meta: |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
58 unique_together = ('bundle', 'version') |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
59 """ |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
60 Needed to allow users to download the originally-uploaded files |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
61 """ |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
62 bundle = models.ForeignKey(Bundle) |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
63 version = models.IntegerField() |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
64 file_name = models.CharField(max_length=256) |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
65 |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
66 def __unicode__(self): |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
67 return self.file_name |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
68 |
4033ebe1867f
Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents:
188
diff
changeset
|
69 |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
70 class BundleFile(MPTTModel): |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
71 bundle = models.ForeignKey(Bundle) |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
72 version = models.IntegerField() |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
73 parent = TreeForeignKey('self', null=True, blank=True, |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
74 related_name='children') |
3 | 75 name = models.CharField(max_length=256) |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
76 is_dir = models.BooleanField() |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
77 code = models.TextField(null=True, blank=True) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
78 full_path = models.CharField(max_length=256) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
79 file_size = FileSizeField(default=0) # for directories |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
80 |
3 | 81 def __unicode__(self): |
82 return self.name | |
83 | |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
84 def get_path(self): |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
85 if self.parent: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
86 return os.path.join(self.parent.get_path(), self.name) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
87 else: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
88 return self.name |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
89 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
90 def get_lines(self): |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
91 return self.code.splitlines() |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
92 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
93 def save_file_contents(self, file, original_filename=None): |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
94 code = file.read() |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
95 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
96 if original_filename is not None: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
97 filename = original_filename |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
98 else: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
99 filename = file.name |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
100 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
101 try: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
102 lexer = lexers.get_lexer_for_filename(filename) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
103 print "lexer is:" |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
104 print lexer |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
105 except util.ClassNotFound: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
106 print "can't guess the lexer" |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
107 lexer = lexers.TextLexer() |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
108 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
109 self.code = highlight(code, lexer, NakedHtmlFormatter()) |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
110 self.save() |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
111 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
112 @models.permalink |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
113 def get_absolute_url(self): |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
114 return ('bundlefile_details', [ |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
115 self.bundle.uploader.username, |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
116 self.bundle.name, |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
176
diff
changeset
|
117 self.version, |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
118 self.get_path() |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
29
diff
changeset
|
119 ]) |