annotate apps/bundle/models.py @ 151:c7be7def8b57

Bundles! (basic functionality) Changes made in this commit: * Added new dependencies (see pip-requirements) * Added new dependency and setup information to README * Deleted the included mptt app (in apps/mptt) in favour of just adding the dependency to pip-requirements (makes it easier to update, etc) * Changed the import convention to use `from apps.bundle.models import Bundle` rather than `from agora.apps.bundle.models import Bundle` because Celery was having problems with the latter style. Everything should still work. * Moved the syntax-highlighting and related code for snippets into separate HTML files so that they can be used by the bundle app And, of course, the ability to upload bundles. But wait! There's more! Changes still to come, for only $19.95 a month: * Bundle versioning * Automatic license integration (i.e. adding headers to files) * The ability to download bundles (zip, tar, etc) * Rating bundles * And much, much more! Batteries not included.
author dellsystem <ilostwaldo@gmail.com>
date Mon, 15 Oct 2012 00:52:00 -0400
parents 6ba969517b9c
children a57d15b044a7
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
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
5 from pygments import lexers, highlight, formatters, util
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
6 from mptt.models import MPTTModel, TreeForeignKey
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
7 from sizefield.models import FileSizeField
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
8
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
9 from apps.free_license.models import FreeLicense
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
10 from apps.snippet.highlight import NakedHtmlFormatter
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
11
2
3cef0d445036 Start actual app structure
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
diff changeset
12
3
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
13 class Bundle(models.Model):
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
14 class Meta:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
15 # Every user must pick unique names for their bundles
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
16 unique_together = ('uploader','name')
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
17 ordering = ['-pub_date']
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
18
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
19 name = models.SlugField()
3
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
20 uploader = models.ForeignKey(User)
29
6ba969517b9c Implement initial profiles, cleanup models, change Free_license to FreeLicense
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 6
diff changeset
21 description = models.TextField(max_length=32728)
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
22 free_license = models.ForeignKey(FreeLicense, default=1)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
23 pub_date = models.DateTimeField('date uploaded', auto_now_add=True)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
24 mod_date = models.DateTimeField('date last modified', auto_now=True)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
25 done_uploading = models.BooleanField(default=False)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
26 file_name = models.CharField(max_length=256) # the uploaded file
6
c83460992637 Elaborate on stub bundle template
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
27
3
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
28 def __unicode__(self):
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
29 return self.name
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
30
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
31 @models.permalink
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
32 def get_absolute_url(self):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
33 return ('bundle_details', [self.uploader.username, self.name])
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
34
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
35 def get_temp_path(self):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
36 return os.path.join('tmp', 'bundles', '%s' % self.id)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
37
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
38
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
39 class BundleFile(MPTTModel):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
40 bundle = models.ForeignKey(Bundle)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
41 parent = TreeForeignKey('self', null=True, blank=True,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
42 related_name='children')
3
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
43 name = models.CharField(max_length=256)
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
44 is_dir = models.BooleanField()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
45 code = models.TextField(null=True, blank=True)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
46 full_path = models.CharField(max_length=256)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
47 file_size = FileSizeField(default=0) # for directories
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
48
3
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
49 def __unicode__(self):
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
50 return self.name
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
51
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
52 def get_path(self):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
53 if self.parent:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
54 return os.path.join(self.parent.get_path(), self.name)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
55 else:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
56 return self.name
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
57
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
58 def get_lines(self):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
59 return self.code.splitlines()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
60
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
61 def save_file_contents(self, file, original_filename=None):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
62 code = file.read()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
63
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
64 if original_filename is not None:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
65 filename = original_filename
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
66 else:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
67 filename = file.name
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
68
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
69 try:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
70 lexer = lexers.get_lexer_for_filename(filename)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
71 print "lexer is:"
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
72 print lexer
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
73 except util.ClassNotFound:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
74 print "can't guess the lexer"
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
75 lexer = lexers.TextLexer()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
76
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
77 self.code = highlight(code, lexer, NakedHtmlFormatter())
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
78 self.save()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
79
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
80 @models.permalink
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
81 def get_absolute_url(self):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
82 return ('bundlefile_details', [
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
83 self.bundle.uploader.username,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
84 self.bundle.name,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
85 self.get_path()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 29
diff changeset
86 ])