Merge lp:~michael.nelson/ubuntu-webcatalog/1015505-extras-not-propietary into lp:ubuntu-webcatalog
- 1015505-extras-not-propietary
- Merge into trunk
Proposed by
Michael Nelson
Status: | Merged |
---|---|
Approved by: | Łukasz Czyżykowski |
Approved revision: | 156 |
Merged at revision: | 151 |
Proposed branch: | lp:~michael.nelson/ubuntu-webcatalog/1015505-extras-not-propietary |
Merge into: | lp:ubuntu-webcatalog |
Diff against target: |
352 lines (+215/-25) 7 files modified
src/webcatalog/migrations/0023_add_license.py (+168/-0) src/webcatalog/models/applications.py (+4/-4) src/webcatalog/templates/webcatalog/install_options_snippet.html (+1/-1) src/webcatalog/tests/factory.py (+2/-2) src/webcatalog/tests/test_commands.py (+1/-0) src/webcatalog/tests/test_data/sca_apps.txt (+2/-1) src/webcatalog/tests/test_views.py (+37/-17) |
To merge this branch: | bzr merge lp:~michael.nelson/ubuntu-webcatalog/1015505-extras-not-propietary |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Łukasz Czyżykowski | Pending | ||
Review via email: mp+112030@code.launchpad.net |
Commit message
Display correct license (from import) on details page.
Description of the change
Overview
========
As per the pre-imp discussion on bug 1015505, this branch adds the Application.license field, and updates the license_type property to be based on that instead of the somewhat confusing Application.
I also update the template so that it displays a 'buy' button when the price is non-zero, rather than depending on the 'for_purchase' field.
`fab test`
We'll rename for_purchase for bug 1015515 to 'imported_
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added file 'src/webcatalog/migrations/0023_add_license.py' | |||
2 | --- src/webcatalog/migrations/0023_add_license.py 1970-01-01 00:00:00 +0000 | |||
3 | +++ src/webcatalog/migrations/0023_add_license.py 2012-06-26 09:42:20 +0000 | |||
4 | @@ -0,0 +1,168 @@ | |||
5 | 1 | # encoding: utf-8 | ||
6 | 2 | import datetime | ||
7 | 3 | from south.db import db | ||
8 | 4 | from south.v2 import SchemaMigration | ||
9 | 5 | from django.db import models | ||
10 | 6 | |||
11 | 7 | class Migration(SchemaMigration): | ||
12 | 8 | |||
13 | 9 | def forwards(self, orm): | ||
14 | 10 | |||
15 | 11 | # Adding field 'Application.license' | ||
16 | 12 | db.add_column('webcatalog_application', 'license', self.gf('django.db.models.fields.CharField')(default='', max_length=64, blank=True), keep_default=False) | ||
17 | 13 | |||
18 | 14 | |||
19 | 15 | def backwards(self, orm): | ||
20 | 16 | |||
21 | 17 | # Deleting field 'Application.license' | ||
22 | 18 | db.delete_column('webcatalog_application', 'license') | ||
23 | 19 | |||
24 | 20 | |||
25 | 21 | models = { | ||
26 | 22 | 'auth.group': { | ||
27 | 23 | 'Meta': {'object_name': 'Group'}, | ||
28 | 24 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
29 | 25 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), | ||
30 | 26 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) | ||
31 | 27 | }, | ||
32 | 28 | 'auth.permission': { | ||
33 | 29 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, | ||
34 | 30 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
35 | 31 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), | ||
36 | 32 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
37 | 33 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) | ||
38 | 34 | }, | ||
39 | 35 | 'auth.user': { | ||
40 | 36 | 'Meta': {'object_name': 'User'}, | ||
41 | 37 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
42 | 38 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), | ||
43 | 39 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
44 | 40 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), | ||
45 | 41 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
46 | 42 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
47 | 43 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
48 | 44 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
49 | 45 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
50 | 46 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
51 | 47 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
52 | 48 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), | ||
53 | 49 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) | ||
54 | 50 | }, | ||
55 | 51 | 'contenttypes.contenttype': { | ||
56 | 52 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, | ||
57 | 53 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
58 | 54 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
59 | 55 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
60 | 56 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
61 | 57 | }, | ||
62 | 58 | 'webcatalog.application': { | ||
63 | 59 | 'Meta': {'ordering': "('-wilson_score', 'name')", 'unique_together': "(('distroseries', 'archive_id'),)", 'object_name': 'Application'}, | ||
64 | 60 | 'app_type': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), | ||
65 | 61 | 'application_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
66 | 62 | 'architectures': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
67 | 63 | 'archive_id': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '64', 'null': 'True', 'blank': 'True'}), | ||
68 | 64 | 'categories': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
69 | 65 | 'channel': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
70 | 66 | 'comment': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
71 | 67 | 'debtags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
72 | 68 | 'departments': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['webcatalog.Department']", 'symmetrical': 'False', 'blank': 'True'}), | ||
73 | 69 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
74 | 70 | 'distroseries': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['webcatalog.DistroSeries']"}), | ||
75 | 71 | 'for_purchase': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
76 | 72 | 'icon': ('django.db.models.fields.files.ImageField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), | ||
77 | 73 | 'icon_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
78 | 74 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
79 | 75 | 'is_latest': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
80 | 76 | 'keywords': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
81 | 77 | 'license': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), | ||
82 | 78 | 'mimetype': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), | ||
83 | 79 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
84 | 80 | 'package_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
85 | 81 | 'popcon': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
86 | 82 | 'price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '7', 'decimal_places': '2', 'blank': 'True'}), | ||
87 | 83 | 'ratings_average': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '3', 'decimal_places': '2', 'blank': 'True'}), | ||
88 | 84 | 'ratings_histogram': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), | ||
89 | 85 | 'ratings_total': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
90 | 86 | 'section': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), | ||
91 | 87 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), | ||
92 | 88 | 'wilson_score': ('django.db.models.fields.FloatField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}) | ||
93 | 89 | }, | ||
94 | 90 | 'webcatalog.applicationmedia': { | ||
95 | 91 | 'Meta': {'ordering': "('url',)", 'unique_together': "(('application', 'url'),)", 'object_name': 'ApplicationMedia'}, | ||
96 | 92 | 'application': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['webcatalog.Application']"}), | ||
97 | 93 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
98 | 94 | 'media_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}), | ||
99 | 95 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) | ||
100 | 96 | }, | ||
101 | 97 | 'webcatalog.consumer': { | ||
102 | 98 | 'Meta': {'object_name': 'Consumer'}, | ||
103 | 99 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
104 | 100 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
105 | 101 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '64'}), | ||
106 | 102 | 'secret': ('django.db.models.fields.CharField', [], {'default': "'DpYRwsRbRiwFRbElWgbhSktlpldyjT'", 'max_length': '255', 'blank': 'True'}), | ||
107 | 103 | 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), | ||
108 | 104 | 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'oauth_consumer'", 'unique': 'True', 'to': "orm['auth.User']"}) | ||
109 | 105 | }, | ||
110 | 106 | 'webcatalog.department': { | ||
111 | 107 | 'Meta': {'object_name': 'Department'}, | ||
112 | 108 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
113 | 109 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), | ||
114 | 110 | 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['webcatalog.Department']", 'null': 'True', 'blank': 'True'}), | ||
115 | 111 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}) | ||
116 | 112 | }, | ||
117 | 113 | 'webcatalog.distroseries': { | ||
118 | 114 | 'Meta': {'object_name': 'DistroSeries'}, | ||
119 | 115 | 'code_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}), | ||
120 | 116 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
121 | 117 | 'prerelease': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
122 | 118 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '10', 'blank': 'True'}) | ||
123 | 119 | }, | ||
124 | 120 | 'webcatalog.exhibit': { | ||
125 | 121 | 'Meta': {'object_name': 'Exhibit'}, | ||
126 | 122 | 'banner_url': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), | ||
127 | 123 | 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
128 | 124 | 'display': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), | ||
129 | 125 | 'distroseries': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['webcatalog.DistroSeries']", 'symmetrical': 'False'}), | ||
130 | 126 | 'html': ('django.db.models.fields.TextField', [], {}), | ||
131 | 127 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
132 | 128 | 'package_names': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), | ||
133 | 129 | 'published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
134 | 130 | 'sca_id': ('django.db.models.fields.IntegerField', [], {}), | ||
135 | 131 | 'weight': ('django.db.models.fields.IntegerField', [], {'default': '0'}) | ||
136 | 132 | }, | ||
137 | 133 | 'webcatalog.machine': { | ||
138 | 134 | 'Meta': {'unique_together': "(('owner', 'uuid'),)", 'object_name': 'Machine'}, | ||
139 | 135 | 'hostname': ('django.db.models.fields.CharField', [], {'max_length': '64'}), | ||
140 | 136 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
141 | 137 | 'logo_checksum': ('django.db.models.fields.CharField', [], {'max_length': '56', 'blank': 'True'}), | ||
142 | 138 | 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), | ||
143 | 139 | 'package_list': ('django.db.models.fields.TextField', [], {}), | ||
144 | 140 | 'packages_checksum': ('django.db.models.fields.CharField', [], {'max_length': '56'}), | ||
145 | 141 | 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}) | ||
146 | 142 | }, | ||
147 | 143 | 'webcatalog.nonce': { | ||
148 | 144 | 'Meta': {'object_name': 'Nonce'}, | ||
149 | 145 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['webcatalog.Consumer']"}), | ||
150 | 146 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
151 | 147 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
152 | 148 | 'nonce': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
153 | 149 | 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['webcatalog.Token']"}) | ||
154 | 150 | }, | ||
155 | 151 | 'webcatalog.reviewstatsimport': { | ||
156 | 152 | 'Meta': {'object_name': 'ReviewStatsImport'}, | ||
157 | 153 | 'distroseries': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['webcatalog.DistroSeries']", 'unique': 'True'}), | ||
158 | 154 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
159 | 155 | 'last_import': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.utcnow'}) | ||
160 | 156 | }, | ||
161 | 157 | 'webcatalog.token': { | ||
162 | 158 | 'Meta': {'object_name': 'Token'}, | ||
163 | 159 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['webcatalog.Consumer']"}), | ||
164 | 160 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
165 | 161 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
166 | 162 | 'token': ('django.db.models.fields.CharField', [], {'default': "'IXcKPvbbhtCyTSqNVxRwfbaHLczIBwpjofnpaaGKLcnQgLWwBL'", 'max_length': '50', 'primary_key': 'True'}), | ||
167 | 163 | 'token_secret': ('django.db.models.fields.CharField', [], {'default': "'eAJdlxCXakKtlHCevxWppBNjLyRSuilBBVbhanfmpXeqhpRBLZ'", 'max_length': '50'}), | ||
168 | 164 | 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) | ||
169 | 165 | } | ||
170 | 166 | } | ||
171 | 167 | |||
172 | 168 | complete_apps = ['webcatalog'] | ||
173 | 0 | 169 | ||
174 | === modified file 'src/webcatalog/models/applications.py' | |||
175 | --- src/webcatalog/models/applications.py 2012-06-21 11:40:36 +0000 | |||
176 | +++ src/webcatalog/models/applications.py 2012-06-26 09:42:20 +0000 | |||
177 | @@ -102,6 +102,9 @@ | |||
178 | 102 | is_latest = models.BooleanField() | 102 | is_latest = models.BooleanField() |
179 | 103 | wilson_score = models.FloatField(null=True, blank=True, db_index=True) | 103 | wilson_score = models.FloatField(null=True, blank=True, db_index=True) |
180 | 104 | debtags = models.CharField(max_length=255, blank=True) | 104 | debtags = models.CharField(max_length=255, blank=True) |
181 | 105 | license = models.CharField( | ||
182 | 106 | max_length=64, blank=True, | ||
183 | 107 | help_text=u"The name of the license used for the app.") | ||
184 | 105 | 108 | ||
185 | 106 | # Other desktop fields used by s-c | 109 | # Other desktop fields used by s-c |
186 | 107 | # x-gnome-fullname | 110 | # x-gnome-fullname |
187 | @@ -174,10 +177,7 @@ | |||
188 | 174 | return crumbs | 177 | return crumbs |
189 | 175 | 178 | ||
190 | 176 | def license_type(self): | 179 | def license_type(self): |
195 | 177 | if self.for_purchase: | 180 | return self.license or "Open Source" |
192 | 178 | return "Proprietary" | ||
193 | 179 | else: | ||
194 | 180 | return "Open Source" | ||
196 | 181 | 181 | ||
197 | 182 | @property | 182 | @property |
198 | 183 | def architectures_list(self): | 183 | def architectures_list(self): |
199 | 184 | 184 | ||
200 | === modified file 'src/webcatalog/templates/webcatalog/install_options_snippet.html' | |||
201 | --- src/webcatalog/templates/webcatalog/install_options_snippet.html 2012-03-13 16:25:34 +0000 | |||
202 | +++ src/webcatalog/templates/webcatalog/install_options_snippet.html 2012-06-26 09:42:20 +0000 | |||
203 | @@ -7,7 +7,7 @@ | |||
204 | 7 | {% endif %} | 7 | {% endif %} |
205 | 8 | {% if display_install_button %} | 8 | {% if display_install_button %} |
206 | 9 | <a href="apt://{{ application.package_name }}"> | 9 | <a href="apt://{{ application.package_name }}"> |
208 | 10 | {% if application.for_purchase %} | 10 | {% if application.price %} |
209 | 11 | <img class="fancy-install" width="200" height="60" alt="" src="{{ STATIC_URL }}images/scbutton-non-free-200px.png" title="Buy it from the Ubuntu Software Centre!"> | 11 | <img class="fancy-install" width="200" height="60" alt="" src="{{ STATIC_URL }}images/scbutton-non-free-200px.png" title="Buy it from the Ubuntu Software Centre!"> |
210 | 12 | {% else %} | 12 | {% else %} |
211 | 13 | <img class="fancy-install" width="200" height="60" alt="" src="{{ STATIC_URL }}images/scbutton-free-200px.png" title="Get it from the Ubuntu Software Centre!"> | 13 | <img class="fancy-install" width="200" height="60" alt="" src="{{ STATIC_URL }}images/scbutton-free-200px.png" title="Get it from the Ubuntu Software Centre!"> |
212 | 14 | 14 | ||
213 | === modified file 'src/webcatalog/tests/factory.py' | |||
214 | --- src/webcatalog/tests/factory.py 2012-06-21 11:40:36 +0000 | |||
215 | +++ src/webcatalog/tests/factory.py 2012-06-26 09:42:20 +0000 | |||
216 | @@ -104,7 +104,7 @@ | |||
217 | 104 | ratings_histogram='', screenshot_url='', | 104 | ratings_histogram='', screenshot_url='', |
218 | 105 | archive_id=None, version='', is_latest=False, | 105 | archive_id=None, version='', is_latest=False, |
219 | 106 | wilson_score=0.0, debtags=[], application_id=None, | 106 | wilson_score=0.0, debtags=[], application_id=None, |
221 | 107 | departments=None): | 107 | departments=None, license='', price=None): |
222 | 108 | if name is None: | 108 | if name is None: |
223 | 109 | name = self.get_unique_string(prefix='Readable Name') | 109 | name = self.get_unique_string(prefix='Readable Name') |
224 | 110 | if package_name is None: | 110 | if package_name is None: |
225 | @@ -124,7 +124,7 @@ | |||
226 | 124 | ratings_histogram=ratings_histogram, | 124 | ratings_histogram=ratings_histogram, |
227 | 125 | archive_id=archive_id, version=version, is_latest=is_latest, | 125 | archive_id=archive_id, version=version, is_latest=is_latest, |
228 | 126 | wilson_score=wilson_score, debtags=debtags, | 126 | wilson_score=wilson_score, debtags=debtags, |
230 | 127 | application_id=application_id) | 127 | application_id=application_id, license=license, price=price) |
231 | 128 | 128 | ||
232 | 129 | if departments is not None: | 129 | if departments is not None: |
233 | 130 | for d in departments: | 130 | for d in departments: |
234 | 131 | 131 | ||
235 | === modified file 'src/webcatalog/tests/test_commands.py' | |||
236 | --- src/webcatalog/tests/test_commands.py 2012-06-21 20:18:44 +0000 | |||
237 | +++ src/webcatalog/tests/test_commands.py 2012-06-26 09:42:20 +0000 | |||
238 | @@ -587,6 +587,7 @@ | |||
239 | 587 | distroseries=self.natty) | 587 | distroseries=self.natty) |
240 | 588 | self.assertEqual(True, app_for_purchase.for_purchase) | 588 | self.assertEqual(True, app_for_purchase.for_purchase) |
241 | 589 | self.assertTrue(app_for_purchase.description.find('hello') > -1) | 589 | self.assertTrue(app_for_purchase.description.find('hello') > -1) |
242 | 590 | self.assertEqual("Proprietary", app_for_purchase.license) | ||
243 | 590 | 591 | ||
244 | 591 | def test_app_gets_distroseries(self): | 592 | def test_app_gets_distroseries(self): |
245 | 592 | with patch_settings(UBUNTU_SERIES_FOR_VERSIONS=TEST_VERSIONS): | 593 | with patch_settings(UBUNTU_SERIES_FOR_VERSIONS=TEST_VERSIONS): |
246 | 593 | 594 | ||
247 | === modified file 'src/webcatalog/tests/test_data/sca_apps.txt' | |||
248 | --- src/webcatalog/tests/test_data/sca_apps.txt 2012-05-03 12:13:00 +0000 | |||
249 | +++ src/webcatalog/tests/test_data/sca_apps.txt 2012-06-26 09:42:20 +0000 | |||
250 | @@ -18,7 +18,8 @@ | |||
251 | 18 | "tos_url": "", | 18 | "tos_url": "", |
252 | 19 | "icon_url": "http://localhost:8000/site_media/icons/2011/06/eg_64x64.png", | 19 | "icon_url": "http://localhost:8000/site_media/icons/2011/06/eg_64x64.png", |
253 | 20 | "categories": "Audio", | 20 | "categories": "Audio", |
255 | 21 | "name": "MyApp" | 21 | "name": "MyApp", |
256 | 22 | "license": "Proprietary" | ||
257 | 22 | }, | 23 | }, |
258 | 23 | { | 24 | { |
259 | 24 | "package_name": "eg_arb_app", | 25 | "package_name": "eg_arb_app", |
260 | 25 | 26 | ||
261 | === modified file 'src/webcatalog/tests/test_views.py' | |||
262 | --- src/webcatalog/tests/test_views.py 2012-06-21 11:44:00 +0000 | |||
263 | +++ src/webcatalog/tests/test_views.py 2012-06-26 09:42:20 +0000 | |||
264 | @@ -76,6 +76,18 @@ | |||
265 | 76 | return reverse('wc-package-detail', | 76 | return reverse('wc-package-detail', |
266 | 77 | args=[app.distroseries.code_name, app.package_name]) | 77 | args=[app.distroseries.code_name, app.package_name]) |
267 | 78 | 78 | ||
268 | 79 | def get_package_details_response(self, package_name, | ||
269 | 80 | useragent=UBUNTU_USERAGENT, distro=None): | ||
270 | 81 | kwargs = dict(package_name=package_name) | ||
271 | 82 | if distro: | ||
272 | 83 | kwargs['distro'] = distro | ||
273 | 84 | url = reverse('wc-package-detail', kwargs=kwargs) | ||
274 | 85 | |||
275 | 86 | if useragent: | ||
276 | 87 | return self.client.get(url, HTTP_USER_AGENT=useragent) | ||
277 | 88 | else: | ||
278 | 89 | return self.client.get(url) | ||
279 | 90 | |||
280 | 79 | def get_app_and_response(self, code_name='natty', version='11.04', | 91 | def get_app_and_response(self, code_name='natty', version='11.04', |
281 | 80 | arch='x86_64', name=None, comment=None, | 92 | arch='x86_64', name=None, comment=None, |
282 | 81 | description=None, detail_distro=None, | 93 | description=None, detail_distro=None, |
283 | @@ -96,13 +108,8 @@ | |||
284 | 96 | if not detail_package: | 108 | if not detail_package: |
285 | 97 | detail_package = app.package_name | 109 | detail_package = app.package_name |
286 | 98 | 110 | ||
294 | 99 | url = reverse('wc-package-detail', | 111 | response = self.get_package_details_response( |
295 | 100 | args=[detail_distro, detail_package]) | 112 | detail_package, distro=detail_distro, useragent=useragent) |
289 | 101 | |||
290 | 102 | if useragent: | ||
291 | 103 | response = self.client.get(url, HTTP_USER_AGENT=useragent) | ||
292 | 104 | else: | ||
293 | 105 | response = self.client.get(url) | ||
296 | 106 | return response, app | 113 | return response, app |
297 | 107 | 114 | ||
298 | 108 | def test_renders_correct_template(self): | 115 | def test_renders_correct_template(self): |
299 | @@ -160,14 +167,20 @@ | |||
300 | 160 | self.assertNotContains(response, '<div class="recommendations">') | 167 | self.assertNotContains(response, '<div class="recommendations">') |
301 | 161 | 168 | ||
302 | 162 | def test_button_for_non_puchase_app(self): | 169 | def test_button_for_non_puchase_app(self): |
304 | 163 | response, app = self.get_app_and_response() | 170 | self.factory.make_application(package_name='pkgfoo', |
305 | 171 | price=None) | ||
306 | 172 | |||
307 | 173 | response = self.get_package_details_response('pkgfoo') | ||
308 | 164 | 174 | ||
309 | 165 | self.assertContains(response, '/assets/images/scbutton-free-200px.png') | 175 | self.assertContains(response, '/assets/images/scbutton-free-200px.png') |
310 | 166 | self.assertNotContains(response, | 176 | self.assertNotContains(response, |
311 | 167 | '/assets/images/scbutton-non-free-200px.png') | 177 | '/assets/images/scbutton-non-free-200px.png') |
312 | 168 | 178 | ||
313 | 169 | def test_button_for_for_puchase_app(self): | 179 | def test_button_for_for_puchase_app(self): |
315 | 170 | response, app = self.get_app_and_response(for_purchase=True) | 180 | self.factory.make_application(package_name='pkgfoo', |
316 | 181 | price=Decimal('12.99')) | ||
317 | 182 | |||
318 | 183 | response = self.get_package_details_response('pkgfoo') | ||
319 | 171 | 184 | ||
320 | 172 | self.assertNotContains(response, | 185 | self.assertNotContains(response, |
321 | 173 | '/assets/images/scbutton-free-200px.png') | 186 | '/assets/images/scbutton-free-200px.png') |
322 | @@ -284,15 +297,22 @@ | |||
323 | 284 | self.assertContains(response, "Ubuntu Quantal") | 297 | self.assertContains(response, "Ubuntu Quantal") |
324 | 285 | 298 | ||
325 | 286 | def test_includes_right_license_type(self): | 299 | def test_includes_right_license_type(self): |
327 | 287 | response, app = self.get_app_and_response(for_purchase=False) | 300 | self.factory.make_application(license="Foo GNL V1", |
328 | 301 | package_name='pkgfoo') | ||
329 | 302 | |||
330 | 303 | response = self.client.get( | ||
331 | 304 | reverse('wc-package-detail', args=['pkgfoo'])) | ||
332 | 305 | |||
333 | 306 | self.assertContains(response, '<td>Foo GNL V1</td>') | ||
334 | 307 | |||
335 | 308 | def test_no_license_assumes_OSS(self): | ||
336 | 309 | self.factory.make_application(license="", | ||
337 | 310 | package_name='pkgfoo') | ||
338 | 311 | |||
339 | 312 | response = self.client.get( | ||
340 | 313 | reverse('wc-package-detail', args=['pkgfoo'])) | ||
341 | 314 | |||
342 | 288 | self.assertContains(response, '<td>Open Source</td>') | 315 | self.assertContains(response, '<td>Open Source</td>') |
343 | 289 | self.assertNotContains(response, '<td>Proprietary</td>') | ||
344 | 290 | |||
345 | 291 | app.for_purchase = True | ||
346 | 292 | app.save() | ||
347 | 293 | response = self.client.get(self.get_app_details_url(app)) | ||
348 | 294 | self.assertContains(response, '<td>Proprietary</td>') | ||
349 | 295 | self.assertNotContains(response, '<td>Open Source</td>') | ||
350 | 296 | 316 | ||
351 | 297 | def test_response_includes_rating_summary(self): | 317 | def test_response_includes_rating_summary(self): |
352 | 298 | distro = self.factory.make_distroseries(code_name='lucid') | 318 | distro = self.factory.make_distroseries(code_name='lucid') |