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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
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
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
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
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
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
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
41 def __unicode__(self):
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
42 return self.name
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
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
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
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
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
81 def __unicode__(self):
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
82 return self.name
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
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 ])