Mercurial > agora
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 |
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 |
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 | 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 | 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 | 28 def __unicode__(self): |
29 return self.name | |
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 | 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 | 49 def __unicode__(self): |
50 return self.name | |
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 ]) |