Merge lp:~michael.nelson/rnr-server/dont-depend-on-appname into lp:rnr-server
- dont-depend-on-appname
- Merge into trunk
Proposed by
Michael Nelson
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Anthony Lenton | ||||
Approved revision: | 173 | ||||
Merged at revision: | 162 | ||||
Proposed branch: | lp:~michael.nelson/rnr-server/dont-depend-on-appname | ||||
Merge into: | lp:rnr-server | ||||
Diff against target: |
583 lines (+417/-20) 8 files modified
src/reviewsapp/api/handlers.py (+1/-1) src/reviewsapp/management/commands/populate.py (+2/-2) src/reviewsapp/migrations/0006_add_review_app_name.py (+160/-0) src/reviewsapp/migrations/0007_populate_review_app_name_and_remove_redundant_software_items.py (+234/-0) src/reviewsapp/models/reviews.py (+6/-4) src/reviewsapp/tests/factory.py (+3/-2) src/reviewsapp/tests/test_handlers.py (+8/-8) src/reviewsapp/tests/test_rnrclient.py (+3/-3) |
||||
To merge this branch: | bzr merge lp:~michael.nelson/rnr-server/dont-depend-on-appname | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Anthony Lenton (community) | Approve | ||
Review via email: mp+54013@code.launchpad.net |
Commit message
[r=achuni][bug=737649] Data migration from SoftwareItem.
Description of the change
Overview
========
This branch adds a schema migration (add Review.app_name column) and a data migration (copy app_name from software items, then remove now-redundant software items).
Unfortunately, testing the migrations sux. The best I could come up with is:
http://
which ensures that for a small subset of data at least, the migration works both forwards and backwards without losing info.
The next branch:
https:/
removes the actual SoftwareItem.
To post a comment you must log in.
Revision history for this message
Anthony Lenton (elachuni) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/reviewsapp/api/handlers.py' | |||
2 | --- src/reviewsapp/api/handlers.py 2011-03-17 14:29:54 +0000 | |||
3 | +++ src/reviewsapp/api/handlers.py 2011-03-18 17:09:28 +0000 | |||
4 | @@ -191,7 +191,7 @@ | |||
5 | 191 | kwargs = dict(item for item in kwargs.items() if item[1] != 'any') | 191 | kwargs = dict(item for item in kwargs.items() if item[1] != 'any') |
6 | 192 | return Review.objects.filter( | 192 | return Review.objects.filter( |
7 | 193 | softwareitem__package_name=package_name, | 193 | softwareitem__package_name=package_name, |
9 | 194 | softwareitem__app_name=appname, | 194 | app_name=appname, |
10 | 195 | hide=False, | 195 | hide=False, |
11 | 196 | **kwargs).order_by( | 196 | **kwargs).order_by( |
12 | 197 | '-usefulness_percentage')[batch_start:batch_end] | 197 | '-usefulness_percentage')[batch_start:batch_end] |
13 | 198 | 198 | ||
14 | === modified file 'src/reviewsapp/management/commands/populate.py' | |||
15 | --- src/reviewsapp/management/commands/populate.py 2011-03-15 14:08:02 +0000 | |||
16 | +++ src/reviewsapp/management/commands/populate.py 2011-03-18 17:09:28 +0000 | |||
17 | @@ -182,7 +182,7 @@ | |||
18 | 182 | Currently (id, softwareitem_id, version, architecture_id, | 182 | Currently (id, softwareitem_id, version, architecture_id, |
19 | 183 | repository_id, reviewer_id, date_created, rating, summary, | 183 | repository_id, reviewer_id, date_created, rating, summary, |
20 | 184 | review_text, language, hide, usefulness_total, | 184 | review_text, language, hide, usefulness_total, |
22 | 185 | usefulness_favorable, usefulness_percentage) | 185 | usefulness_favorable, usefulness_percentage, app_name) |
23 | 186 | """ | 186 | """ |
24 | 187 | softwareitem_id = randint(*self.ranges['reviewsapp_softwareitem']) | 187 | softwareitem_id = randint(*self.ranges['reviewsapp_softwareitem']) |
25 | 188 | version = '%.1f' % random() | 188 | version = '%.1f' % random() |
26 | @@ -195,5 +195,5 @@ | |||
27 | 195 | review_text = self.random_comment(wordcount=20) | 195 | review_text = self.random_comment(wordcount=20) |
28 | 196 | false = self.booleans[0] | 196 | false = self.booleans[0] |
29 | 197 | return [id, softwareitem_id, version, arch_id, repo_id, reviewer_id, | 197 | return [id, softwareitem_id, version, arch_id, repo_id, reviewer_id, |
31 | 198 | date_created, rating, summary, review_text, 'en', false, 0, 0, 0] | 198 | date_created, rating, summary, review_text, 'en', false, 0, 0, 0, ''] |
32 | 199 | 199 | ||
33 | 200 | 200 | ||
34 | === added file 'src/reviewsapp/migrations/0006_add_review_app_name.py' | |||
35 | --- src/reviewsapp/migrations/0006_add_review_app_name.py 1970-01-01 00:00:00 +0000 | |||
36 | +++ src/reviewsapp/migrations/0006_add_review_app_name.py 2011-03-18 17:09:28 +0000 | |||
37 | @@ -0,0 +1,160 @@ | |||
38 | 1 | |||
39 | 2 | from south.db import db | ||
40 | 3 | from django.db import models | ||
41 | 4 | from reviewsapp.models import * | ||
42 | 5 | |||
43 | 6 | class Migration: | ||
44 | 7 | |||
45 | 8 | def forwards(self, orm): | ||
46 | 9 | |||
47 | 10 | # Adding field 'Review.app_name' | ||
48 | 11 | db.add_column('reviewsapp_review', 'app_name', orm['reviewsapp.review:app_name']) | ||
49 | 12 | |||
50 | 13 | def backwards(self, orm): | ||
51 | 14 | |||
52 | 15 | # Deleting field 'Review.app_name' | ||
53 | 16 | db.delete_column('reviewsapp_review', 'app_name') | ||
54 | 17 | |||
55 | 18 | |||
56 | 19 | models = { | ||
57 | 20 | 'auth.group': { | ||
58 | 21 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
59 | 22 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), | ||
60 | 23 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) | ||
61 | 24 | }, | ||
62 | 25 | 'auth.permission': { | ||
63 | 26 | 'Meta': {'unique_together': "(('content_type', 'codename'),)"}, | ||
64 | 27 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
65 | 28 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), | ||
66 | 29 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
67 | 30 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) | ||
68 | 31 | }, | ||
69 | 32 | 'auth.user': { | ||
70 | 33 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
71 | 34 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), | ||
72 | 35 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
73 | 36 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), | ||
74 | 37 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
75 | 38 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), | ||
76 | 39 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), | ||
77 | 40 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), | ||
78 | 41 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
79 | 42 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
80 | 43 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
81 | 44 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), | ||
82 | 45 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) | ||
83 | 46 | }, | ||
84 | 47 | 'contenttypes.contenttype': { | ||
85 | 48 | 'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"}, | ||
86 | 49 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
87 | 50 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
88 | 51 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
89 | 52 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
90 | 53 | }, | ||
91 | 54 | 'reviewsapp.architecture': { | ||
92 | 55 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
93 | 56 | 'tag': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '16'}) | ||
94 | 57 | }, | ||
95 | 58 | 'reviewsapp.consumer': { | ||
96 | 59 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
97 | 60 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
98 | 61 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '64'}), | ||
99 | 62 | 'secret': ('django.db.models.fields.CharField', [], {'default': "'OzuURCXRwhChWIMXbLbcgooiStFeze'", 'max_length': '255', 'blank': 'True'}), | ||
100 | 63 | 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), | ||
101 | 64 | 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'oauth_consumer'", 'unique': 'True', 'to': "orm['auth.User']"}) | ||
102 | 65 | }, | ||
103 | 66 | 'reviewsapp.nonce': { | ||
104 | 67 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Consumer']"}), | ||
105 | 68 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
106 | 69 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
107 | 70 | 'nonce': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
108 | 71 | 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Token']"}) | ||
109 | 72 | }, | ||
110 | 73 | 'reviewsapp.repository': { | ||
111 | 74 | 'distroseries': ('django.db.models.fields.SlugField', [], {'max_length': '25', 'db_index': 'True'}), | ||
112 | 75 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
113 | 76 | 'origin': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'db_index': 'True'}) | ||
114 | 77 | }, | ||
115 | 78 | 'reviewsapp.review': { | ||
116 | 79 | 'app_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), | ||
117 | 80 | 'architecture': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Architecture']"}), | ||
118 | 81 | 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 11, 25, 823060)'}), | ||
119 | 82 | 'hide': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), | ||
120 | 83 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
121 | 84 | 'language': ('django.db.models.fields.SlugField', [], {'max_length': '10', 'db_index': 'True'}), | ||
122 | 85 | 'rating': ('django.db.models.fields.IntegerField', [], {}), | ||
123 | 86 | 'repository': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Repository']"}), | ||
124 | 87 | 'review_text': ('django.db.models.fields.CharField', [], {'max_length': '5000'}), | ||
125 | 88 | 'reviewer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), | ||
126 | 89 | 'softwareitem': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.SoftwareItem']"}), | ||
127 | 90 | 'summary': ('django.db.models.fields.CharField', [], {'max_length': '80'}), | ||
128 | 91 | 'usefulness_favorable': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
129 | 92 | 'usefulness_percentage': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
130 | 93 | 'usefulness_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
131 | 94 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
132 | 95 | }, | ||
133 | 96 | 'reviewsapp.reviewmoderation': { | ||
134 | 97 | 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 11, 25, 770486)'}), | ||
135 | 98 | 'date_moderated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), | ||
136 | 99 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
137 | 100 | 'moderation_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
138 | 101 | 'moderator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), | ||
139 | 102 | 'review': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Review']"}), | ||
140 | 103 | 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}) | ||
141 | 104 | }, | ||
142 | 105 | 'reviewsapp.reviewmoderationflag': { | ||
143 | 106 | 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 11, 25, 569414)'}), | ||
144 | 107 | 'description': ('django.db.models.fields.TextField', [], {}), | ||
145 | 108 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
146 | 109 | 'review_moderation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.ReviewModeration']"}), | ||
147 | 110 | 'summary': ('django.db.models.fields.CharField', [], {'max_length': '200'}), | ||
148 | 111 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}) | ||
149 | 112 | }, | ||
150 | 113 | 'reviewsapp.rnrsettings': { | ||
151 | 114 | 'blacklist_words': ('django.db.models.fields.TextField', [], {'default': "''"}), | ||
152 | 115 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
153 | 116 | 'moderation_mode': ('django.db.models.fields.CharField', [], {'default': "'passive'", 'max_length': '8'}) | ||
154 | 117 | }, | ||
155 | 118 | 'reviewsapp.softwareitem': { | ||
156 | 119 | 'app_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), | ||
157 | 120 | 'date_ratings_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 11, 24, 339806)'}), | ||
158 | 121 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
159 | 122 | 'package_name': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'db_index': 'True'}), | ||
160 | 123 | 'ratings_average': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '3', 'decimal_places': '2'}), | ||
161 | 124 | 'ratings_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}) | ||
162 | 125 | }, | ||
163 | 126 | 'reviewsapp.softwareiteminorigin': { | ||
164 | 127 | 'Meta': {'unique_together': "(('softwareitem', 'origin'),)"}, | ||
165 | 128 | 'date_ratings_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 11, 24, 339806)'}), | ||
166 | 129 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
167 | 130 | 'origin': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'db_index': 'True'}), | ||
168 | 131 | 'ratings_average': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '3', 'decimal_places': '2'}), | ||
169 | 132 | 'ratings_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
170 | 133 | 'softwareitem': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.SoftwareItem']"}) | ||
171 | 134 | }, | ||
172 | 135 | 'reviewsapp.softwareiteminrepository': { | ||
173 | 136 | 'Meta': {'unique_together': "(('softwareitem', 'repository'),)"}, | ||
174 | 137 | 'date_ratings_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 11, 24, 339806)'}), | ||
175 | 138 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
176 | 139 | 'ratings_average': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '3', 'decimal_places': '2'}), | ||
177 | 140 | 'ratings_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
178 | 141 | 'repository': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Repository']"}), | ||
179 | 142 | 'softwareitem': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.SoftwareItem']"}) | ||
180 | 143 | }, | ||
181 | 144 | 'reviewsapp.token': { | ||
182 | 145 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Consumer']"}), | ||
183 | 146 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
184 | 147 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
185 | 148 | 'token': ('django.db.models.fields.CharField', [], {'default': "'LXGJOoldWHCXXULnsTXhHOGmAaKCYUrXJRRgrfUjMaJfObdlEU'", 'max_length': '50', 'primary_key': 'True'}), | ||
186 | 149 | 'token_secret': ('django.db.models.fields.CharField', [], {'default': "'MnRkFdkPZXmIqCKNExfyzqdWifIWiWaoZGQKNdtoounoziJVsU'", 'max_length': '50'}), | ||
187 | 150 | 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) | ||
188 | 151 | }, | ||
189 | 152 | 'reviewsapp.usefulness': { | ||
190 | 153 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
191 | 154 | 'review': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Review']"}), | ||
192 | 155 | 'useful': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), | ||
193 | 156 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) | ||
194 | 157 | } | ||
195 | 158 | } | ||
196 | 159 | |||
197 | 160 | complete_apps = ['reviewsapp'] | ||
198 | 0 | 161 | ||
199 | === added file 'src/reviewsapp/migrations/0007_populate_review_app_name_and_remove_redundant_software_items.py' | |||
200 | --- src/reviewsapp/migrations/0007_populate_review_app_name_and_remove_redundant_software_items.py 1970-01-01 00:00:00 +0000 | |||
201 | +++ src/reviewsapp/migrations/0007_populate_review_app_name_and_remove_redundant_software_items.py 2011-03-18 17:09:28 +0000 | |||
202 | @@ -0,0 +1,234 @@ | |||
203 | 1 | |||
204 | 2 | from south.db import db | ||
205 | 3 | from django.db import models | ||
206 | 4 | from reviewsapp.models import * | ||
207 | 5 | |||
208 | 6 | class Migration: | ||
209 | 7 | |||
210 | 8 | def forwards(self, orm): | ||
211 | 9 | """Copy the app name from the software item and update the link.""" | ||
212 | 10 | # For each software_item, we want to update all the related | ||
213 | 11 | # reviews. | ||
214 | 12 | for software_item in orm['reviewsapp.softwareitem'].objects.all(): | ||
215 | 13 | software_item.review_set.update( | ||
216 | 14 | app_name=software_item.app_name) | ||
217 | 15 | |||
218 | 16 | # Next, we ensure that all the reviews for a given packagename | ||
219 | 17 | # refer to a single software_item, and delete the redundant | ||
220 | 18 | # softawre_items. | ||
221 | 19 | package_names = orm['reviewsapp.softwareitem'].objects.values_list( | ||
222 | 20 | 'package_name', flat=True) | ||
223 | 21 | package_names = package_names.order_by('package_name').distinct() | ||
224 | 22 | for package_name in package_names: | ||
225 | 23 | # Grab all the reviews for a given package name and update | ||
226 | 24 | # them to all point to the one software item. | ||
227 | 25 | reviews = orm['reviewsapp.review'].objects.filter( | ||
228 | 26 | softwareitem__package_name=package_name) | ||
229 | 27 | first_review = reviews[0] | ||
230 | 28 | remaining_software_item = reviews[0].softwareitem | ||
231 | 29 | reviews.update(softwareitem=remaining_software_item) | ||
232 | 30 | |||
233 | 31 | # Now delete all the other software items with the same | ||
234 | 32 | # package name (and software item in origins / | ||
235 | 33 | # repositories). | ||
236 | 34 | orm['reviewsapp.softwareitem'].objects.filter( | ||
237 | 35 | package_name=package_name).exclude( | ||
238 | 36 | id=remaining_software_item.id).delete() | ||
239 | 37 | |||
240 | 38 | # Finally, we need to ensure that each review corresponds | ||
241 | 39 | # to a valid SoftwareItemInRepository so that stats can be | ||
242 | 40 | # calculated. | ||
243 | 41 | self.ensure_softwareitem_in_repos(orm, remaining_software_item) | ||
244 | 42 | |||
245 | 43 | def backwards(self, orm): | ||
246 | 44 | """Create the software items with app names and update reviews.""" | ||
247 | 45 | SoftwareItemClass = orm['reviewsapp.softwareitem'] | ||
248 | 46 | for software_item in SoftwareItemClass.objects.all(): | ||
249 | 47 | app_names = software_item.review_set.values_list( | ||
250 | 48 | 'app_name', flat=True).distinct() | ||
251 | 49 | software_item.app_name = app_names[0] | ||
252 | 50 | software_item.save() | ||
253 | 51 | package_name = software_item.package_name | ||
254 | 52 | # We need to recreate the repository/origin stats for | ||
255 | 53 | # the existing softwareitem. | ||
256 | 54 | software_item.softwareiteminrepository_set.all().delete() | ||
257 | 55 | software_item.softwareiteminorigin_set.all().delete() | ||
258 | 56 | |||
259 | 57 | # For any other app names, we create a new software item and | ||
260 | 58 | # point the relevant reviews to it. | ||
261 | 59 | for app_name in app_names: | ||
262 | 60 | new_item, created = SoftwareItemClass.objects.get_or_create( | ||
263 | 61 | package_name=package_name, | ||
264 | 62 | app_name=app_name) | ||
265 | 63 | |||
266 | 64 | orm['reviewsapp.review'].objects.filter( | ||
267 | 65 | softwareitem=software_item, | ||
268 | 66 | app_name=app_name).update( | ||
269 | 67 | softwareitem=new_item) | ||
270 | 68 | |||
271 | 69 | # Once all review.software_items have been updated, we can | ||
272 | 70 | # create the related items in repos etc. | ||
273 | 71 | for item in SoftwareItemClass.objects.all(): | ||
274 | 72 | self.ensure_softwareitem_in_repos(orm, item) | ||
275 | 73 | |||
276 | 74 | # Finally, blank out the Review.app_name field. | ||
277 | 75 | orm['reviewsapp.review'].objects.all().update(app_name='') | ||
278 | 76 | |||
279 | 77 | def ensure_softwareitem_in_repos(self, orm, software_item): | ||
280 | 78 | # Find all reviews referencing the item and get a list of | ||
281 | 79 | # distint repositories. | ||
282 | 80 | reviews = orm['reviewsapp.review'].objects.filter( | ||
283 | 81 | softwareitem=software_item) | ||
284 | 82 | repository_ids = reviews.values_list('repository', flat=True).distinct() | ||
285 | 83 | SIIRepo = orm['reviewsapp.softwareiteminrepository'] | ||
286 | 84 | SIIOrigin = orm['reviewsapp.softwareiteminorigin'] | ||
287 | 85 | for repo_id in repository_ids: | ||
288 | 86 | repo = orm['reviewsapp.repository'].objects.get(id=repo_id) | ||
289 | 87 | item_in_repo, created = SIIRepo.objects.get_or_create( | ||
290 | 88 | softwareitem=software_item, repository=repo) | ||
291 | 89 | item_in_origin, created = SIIOrigin.objects.get_or_create( | ||
292 | 90 | softwareitem=software_item, origin=repo.origin) | ||
293 | 91 | |||
294 | 92 | |||
295 | 93 | models = { | ||
296 | 94 | 'auth.group': { | ||
297 | 95 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
298 | 96 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), | ||
299 | 97 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) | ||
300 | 98 | }, | ||
301 | 99 | 'auth.permission': { | ||
302 | 100 | 'Meta': {'unique_together': "(('content_type', 'codename'),)"}, | ||
303 | 101 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
304 | 102 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), | ||
305 | 103 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
306 | 104 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) | ||
307 | 105 | }, | ||
308 | 106 | 'auth.user': { | ||
309 | 107 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
310 | 108 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), | ||
311 | 109 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
312 | 110 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), | ||
313 | 111 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
314 | 112 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), | ||
315 | 113 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), | ||
316 | 114 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), | ||
317 | 115 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
318 | 116 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
319 | 117 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
320 | 118 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), | ||
321 | 119 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) | ||
322 | 120 | }, | ||
323 | 121 | 'contenttypes.contenttype': { | ||
324 | 122 | 'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"}, | ||
325 | 123 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
326 | 124 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
327 | 125 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
328 | 126 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
329 | 127 | }, | ||
330 | 128 | 'reviewsapp.architecture': { | ||
331 | 129 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
332 | 130 | 'tag': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '16'}) | ||
333 | 131 | }, | ||
334 | 132 | 'reviewsapp.consumer': { | ||
335 | 133 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
336 | 134 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
337 | 135 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '64'}), | ||
338 | 136 | 'secret': ('django.db.models.fields.CharField', [], {'default': "'qBxqBnulneXJvOyccXpAJdJmhzatIw'", 'max_length': '255', 'blank': 'True'}), | ||
339 | 137 | 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), | ||
340 | 138 | 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'oauth_consumer'", 'unique': 'True', 'to': "orm['auth.User']"}) | ||
341 | 139 | }, | ||
342 | 140 | 'reviewsapp.nonce': { | ||
343 | 141 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Consumer']"}), | ||
344 | 142 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
345 | 143 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
346 | 144 | 'nonce': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
347 | 145 | 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Token']"}) | ||
348 | 146 | }, | ||
349 | 147 | 'reviewsapp.repository': { | ||
350 | 148 | 'distroseries': ('django.db.models.fields.SlugField', [], {'max_length': '25', 'db_index': 'True'}), | ||
351 | 149 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
352 | 150 | 'origin': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'db_index': 'True'}) | ||
353 | 151 | }, | ||
354 | 152 | 'reviewsapp.review': { | ||
355 | 153 | 'app_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), | ||
356 | 154 | 'architecture': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Architecture']"}), | ||
357 | 155 | 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 13, 11, 823749)'}), | ||
358 | 156 | 'hide': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), | ||
359 | 157 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
360 | 158 | 'language': ('django.db.models.fields.SlugField', [], {'max_length': '10', 'db_index': 'True'}), | ||
361 | 159 | 'rating': ('django.db.models.fields.IntegerField', [], {}), | ||
362 | 160 | 'repository': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Repository']"}), | ||
363 | 161 | 'review_text': ('django.db.models.fields.CharField', [], {'max_length': '5000'}), | ||
364 | 162 | 'reviewer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), | ||
365 | 163 | 'softwareitem': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.SoftwareItem']"}), | ||
366 | 164 | 'summary': ('django.db.models.fields.CharField', [], {'max_length': '80'}), | ||
367 | 165 | 'usefulness_favorable': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
368 | 166 | 'usefulness_percentage': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
369 | 167 | 'usefulness_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
370 | 168 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
371 | 169 | }, | ||
372 | 170 | 'reviewsapp.reviewmoderation': { | ||
373 | 171 | 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 13, 11, 959691)'}), | ||
374 | 172 | 'date_moderated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), | ||
375 | 173 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
376 | 174 | 'moderation_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
377 | 175 | 'moderator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), | ||
378 | 176 | 'review': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Review']"}), | ||
379 | 177 | 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}) | ||
380 | 178 | }, | ||
381 | 179 | 'reviewsapp.reviewmoderationflag': { | ||
382 | 180 | 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 13, 12, 530560)'}), | ||
383 | 181 | 'description': ('django.db.models.fields.TextField', [], {}), | ||
384 | 182 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
385 | 183 | 'review_moderation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.ReviewModeration']"}), | ||
386 | 184 | 'summary': ('django.db.models.fields.CharField', [], {'max_length': '200'}), | ||
387 | 185 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}) | ||
388 | 186 | }, | ||
389 | 187 | 'reviewsapp.rnrsettings': { | ||
390 | 188 | 'blacklist_words': ('django.db.models.fields.TextField', [], {'default': "''"}), | ||
391 | 189 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
392 | 190 | 'moderation_mode': ('django.db.models.fields.CharField', [], {'default': "'passive'", 'max_length': '8'}) | ||
393 | 191 | }, | ||
394 | 192 | 'reviewsapp.softwareitem': { | ||
395 | 193 | 'app_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True', 'default': "''"}), | ||
396 | 194 | 'date_ratings_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 13, 11, 529267)'}), | ||
397 | 195 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
398 | 196 | 'package_name': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'db_index': 'True'}), | ||
399 | 197 | 'ratings_average': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '3', 'decimal_places': '2'}), | ||
400 | 198 | 'ratings_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}) | ||
401 | 199 | }, | ||
402 | 200 | 'reviewsapp.softwareiteminorigin': { | ||
403 | 201 | 'Meta': {'unique_together': "(('softwareitem', 'origin'),)"}, | ||
404 | 202 | 'date_ratings_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 13, 11, 529267)'}), | ||
405 | 203 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
406 | 204 | 'origin': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'db_index': 'True'}), | ||
407 | 205 | 'ratings_average': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '3', 'decimal_places': '2'}), | ||
408 | 206 | 'ratings_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
409 | 207 | 'softwareitem': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.SoftwareItem']"}) | ||
410 | 208 | }, | ||
411 | 209 | 'reviewsapp.softwareiteminrepository': { | ||
412 | 210 | 'Meta': {'unique_together': "(('softwareitem', 'repository'),)"}, | ||
413 | 211 | 'date_ratings_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 3, 18, 11, 13, 11, 529267)'}), | ||
414 | 212 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
415 | 213 | 'ratings_average': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '3', 'decimal_places': '2'}), | ||
416 | 214 | 'ratings_total': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
417 | 215 | 'repository': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Repository']"}), | ||
418 | 216 | 'softwareitem': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.SoftwareItem']"}) | ||
419 | 217 | }, | ||
420 | 218 | 'reviewsapp.token': { | ||
421 | 219 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Consumer']"}), | ||
422 | 220 | 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), | ||
423 | 221 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
424 | 222 | 'token': ('django.db.models.fields.CharField', [], {'default': "'mwoIqDbtCeQyFKvSAnleoBTvXpZzbKjDdkxAmBxsqpuAftkRvt'", 'max_length': '50', 'primary_key': 'True'}), | ||
425 | 223 | 'token_secret': ('django.db.models.fields.CharField', [], {'default': "'wTeEOEKkKzbDsJPtEUszuDgiDToSnKlTZjnOIrDlWXYKNkDkSr'", 'max_length': '50'}), | ||
426 | 224 | 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) | ||
427 | 225 | }, | ||
428 | 226 | 'reviewsapp.usefulness': { | ||
429 | 227 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
430 | 228 | 'review': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviewsapp.Review']"}), | ||
431 | 229 | 'useful': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}), | ||
432 | 230 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) | ||
433 | 231 | } | ||
434 | 232 | } | ||
435 | 233 | |||
436 | 234 | complete_apps = ['reviewsapp'] | ||
437 | 0 | 235 | ||
438 | === modified file 'src/reviewsapp/models/reviews.py' | |||
439 | --- src/reviewsapp/models/reviews.py 2011-03-18 07:29:55 +0000 | |||
440 | +++ src/reviewsapp/models/reviews.py 2011-03-18 17:09:28 +0000 | |||
441 | @@ -307,6 +307,11 @@ | |||
442 | 307 | usefulness_total = models.IntegerField(default=0) | 307 | usefulness_total = models.IntegerField(default=0) |
443 | 308 | usefulness_favorable = models.IntegerField(default=0) | 308 | usefulness_favorable = models.IntegerField(default=0) |
444 | 309 | usefulness_percentage = models.IntegerField(default=0) | 309 | usefulness_percentage = models.IntegerField(default=0) |
445 | 310 | # XXX 2011-03-18 michaeln Remove application_name eventually. | ||
446 | 311 | # After removing the app_name attribute of software item, we add it | ||
447 | 312 | # here on the review so that we're not losing any information being | ||
448 | 313 | # passed by the client. | ||
449 | 314 | app_name = models.CharField(max_length=100, default='', blank=True) | ||
450 | 310 | 315 | ||
451 | 311 | def __unicode__(self): | 316 | def __unicode__(self): |
452 | 312 | return u'lang: {0}, rating: {1}, summary: {2}\n{3}'.format( | 317 | return u'lang: {0}, rating: {1}, summary: {2}\n{3}'.format( |
453 | @@ -322,9 +327,6 @@ | |||
454 | 322 | def package_name(self): | 327 | def package_name(self): |
455 | 323 | return self.softwareitem.package_name | 328 | return self.softwareitem.package_name |
456 | 324 | 329 | ||
457 | 325 | def app_name(self): | ||
458 | 326 | return self.softwareitem.app_name | ||
459 | 327 | |||
460 | 328 | def origin(self): | 330 | def origin(self): |
461 | 329 | return self.repository.origin | 331 | return self.repository.origin |
462 | 330 | 332 | ||
463 | @@ -332,7 +334,7 @@ | |||
464 | 332 | return self.repository.distroseries | 334 | return self.repository.distroseries |
465 | 333 | 335 | ||
466 | 334 | def package_app_name(self): | 336 | def package_app_name(self): |
468 | 335 | app_name = self.app_name() | 337 | app_name = self.app_name |
469 | 336 | if app_name: | 338 | if app_name: |
470 | 337 | return self.package_name() + "/" + app_name | 339 | return self.package_name() + "/" + app_name |
471 | 338 | else: | 340 | else: |
472 | 339 | 341 | ||
473 | === modified file 'src/reviewsapp/tests/factory.py' | |||
474 | --- src/reviewsapp/tests/factory.py 2011-03-17 09:21:32 +0000 | |||
475 | +++ src/reviewsapp/tests/factory.py 2011-03-18 17:09:28 +0000 | |||
476 | @@ -160,7 +160,7 @@ | |||
477 | 160 | def makeReview(self, reviewer=None, software_item=None, repository=None, | 160 | def makeReview(self, reviewer=None, software_item=None, repository=None, |
478 | 161 | version=None, rating="5", summary=None, review_text=None, | 161 | version=None, rating="5", summary=None, review_text=None, |
479 | 162 | date_created=None, language=None, hide=False, num_flags=0, | 162 | date_created=None, language=None, hide=False, num_flags=0, |
481 | 163 | architecture='i386'): | 163 | architecture='i386', app_name=''): |
482 | 164 | if reviewer is None: | 164 | if reviewer is None: |
483 | 165 | reviewer = self.makeUser() | 165 | reviewer = self.makeUser() |
484 | 166 | if software_item is None: | 166 | if software_item is None: |
485 | @@ -185,7 +185,8 @@ | |||
486 | 185 | softwareitem=software_item, repository=repository, | 185 | softwareitem=software_item, repository=repository, |
487 | 186 | version=version, rating=rating, summary=summary, | 186 | version=version, rating=rating, summary=summary, |
488 | 187 | review_text=review_text, language=language, hide=hide, | 187 | review_text=review_text, language=language, hide=hide, |
490 | 188 | date_created=date_created, architecture=architecture) | 188 | date_created=date_created, architecture=architecture, |
491 | 189 | app_name=app_name) | ||
492 | 189 | review.softwareitem_in_repository.update_stats() | 190 | review.softwareitem_in_repository.update_stats() |
493 | 190 | for flag_count in range(num_flags): | 191 | for flag_count in range(num_flags): |
494 | 191 | review.flag( | 192 | review.flag( |
495 | 192 | 193 | ||
496 | === modified file 'src/reviewsapp/tests/test_handlers.py' | |||
497 | --- src/reviewsapp/tests/test_handlers.py 2011-03-17 11:52:10 +0000 | |||
498 | +++ src/reviewsapp/tests/test_handlers.py 2011-03-18 17:09:28 +0000 | |||
499 | @@ -69,7 +69,7 @@ | |||
500 | 69 | def _get_url_kwargs_dict_for_review(review): | 69 | def _get_url_kwargs_dict_for_review(review): |
501 | 70 | # this is the quoting we expect | 70 | # this is the quoting we expect |
502 | 71 | appname=quote_plus(quote_plus( | 71 | appname=quote_plus(quote_plus( |
504 | 72 | ";"+review.softwareitem.app_name.encode("utf-8"))) | 72 | ";"+review.app_name.encode("utf-8"))) |
505 | 73 | pkgname=review.softwareitem.package_name | 73 | pkgname=review.softwareitem.package_name |
506 | 74 | return dict(language=review.language, | 74 | return dict(language=review.language, |
507 | 75 | origin=review.repository.origin, | 75 | origin=review.repository.origin, |
508 | @@ -332,8 +332,8 @@ | |||
509 | 332 | 332 | ||
510 | 333 | def test_review_for_app(self): | 333 | def test_review_for_app(self): |
511 | 334 | review = self.factory.makeReview( | 334 | review = self.factory.makeReview( |
514 | 335 | software_item=self.factory.makeSoftwareItem('package_foo', | 335 | software_item=self.factory.makeSoftwareItem('package_foo'), |
515 | 336 | app_name='app_foo')) | 336 | app_name='app_foo') |
516 | 337 | handler = ShowReviewsHandler() | 337 | handler = ShowReviewsHandler() |
517 | 338 | 338 | ||
518 | 339 | reviews = handler.read(None, 'any', 'any', 'any', 'any', | 339 | reviews = handler.read(None, 'any', 'any', 'any', 'any', |
519 | @@ -345,15 +345,15 @@ | |||
520 | 345 | def test_review_for_app_url(self): | 345 | def test_review_for_app_url(self): |
521 | 346 | # test utf8 encoded app | 346 | # test utf8 encoded app |
522 | 347 | review = self.factory.makeReview( | 347 | review = self.factory.makeReview( |
525 | 348 | software_item=self.factory.makeSoftwareItem('package_foo', | 348 | software_item=self.factory.makeSoftwareItem('package_foo'), |
526 | 349 | app_name=u'Déjà Dup')) | 349 | app_name=u'Déjà Dup') |
527 | 350 | url = reverse( | 350 | url = reverse( |
528 | 351 | 'rnr-api-reviews-for-package', | 351 | 'rnr-api-reviews-for-package', |
529 | 352 | kwargs=_get_url_kwargs_dict_for_review(review)) | 352 | kwargs=_get_url_kwargs_dict_for_review(review)) |
530 | 353 | response = self.client.get(url) | 353 | response = self.client.get(url) |
531 | 354 | self.assertEqual(response.status_code, 200) | 354 | self.assertEqual(response.status_code, 200) |
532 | 355 | reviews = simplejson.loads(response.content) | 355 | reviews = simplejson.loads(response.content) |
534 | 356 | self.assertEqual(reviews[0]["app_name"], review.app_name()) | 356 | self.assertEqual(reviews[0]["app_name"], review.app_name) |
535 | 357 | self.assertEqual(reviews[0]["package_name"], review.package_name()) | 357 | self.assertEqual(reviews[0]["package_name"], review.package_name()) |
536 | 358 | 358 | ||
537 | 359 | # now repeat with blender that contains a () | 359 | # now repeat with blender that contains a () |
538 | @@ -366,7 +366,7 @@ | |||
539 | 366 | response = self.client.get(url) | 366 | response = self.client.get(url) |
540 | 367 | self.assertEqual(response.status_code, 200) | 367 | self.assertEqual(response.status_code, 200) |
541 | 368 | reviews = simplejson.loads(response.content) | 368 | reviews = simplejson.loads(response.content) |
543 | 369 | self.assertEqual(reviews[0]["app_name"], review.app_name()) | 369 | self.assertEqual(reviews[0]["app_name"], review.app_name) |
544 | 370 | self.assertEqual(reviews[0]["package_name"], review.package_name()) | 370 | self.assertEqual(reviews[0]["package_name"], review.package_name()) |
545 | 371 | 371 | ||
546 | 372 | # now repeat with a fake app that contains a ";" | 372 | # now repeat with a fake app that contains a ";" |
547 | @@ -379,7 +379,7 @@ | |||
548 | 379 | response = self.client.get(url) | 379 | response = self.client.get(url) |
549 | 380 | self.assertEqual(response.status_code, 200) | 380 | self.assertEqual(response.status_code, 200) |
550 | 381 | reviews = simplejson.loads(response.content) | 381 | reviews = simplejson.loads(response.content) |
552 | 382 | self.assertEqual(reviews[0]["app_name"], review.app_name()) | 382 | self.assertEqual(reviews[0]["app_name"], review.app_name) |
553 | 383 | self.assertEqual(reviews[0]["package_name"], review.package_name()) | 383 | self.assertEqual(reviews[0]["package_name"], review.package_name()) |
554 | 384 | 384 | ||
555 | 385 | def test_review_for_language(self): | 385 | def test_review_for_language(self): |
556 | 386 | 386 | ||
557 | === modified file 'src/reviewsapp/tests/test_rnrclient.py' | |||
558 | --- src/reviewsapp/tests/test_rnrclient.py 2011-03-17 11:52:10 +0000 | |||
559 | +++ src/reviewsapp/tests/test_rnrclient.py 2011-03-18 17:09:28 +0000 | |||
560 | @@ -147,7 +147,7 @@ | |||
561 | 147 | 147 | ||
562 | 148 | self.assertEqual(1, len(reviews)) | 148 | self.assertEqual(1, len(reviews)) |
563 | 149 | self.assertEqual(review.package_name(), reviews[0].package_name) | 149 | self.assertEqual(review.package_name(), reviews[0].package_name) |
565 | 150 | self.assertEqual(review.app_name(), reviews[0].app_name) | 150 | self.assertEqual(review.app_name, reviews[0].app_name) |
566 | 151 | self.assertEqual(review.summary, reviews[0].summary) | 151 | self.assertEqual(review.summary, reviews[0].summary) |
567 | 152 | self.assertEqual(review.version, reviews[0].version) | 152 | self.assertEqual(review.version, reviews[0].version) |
568 | 153 | self.assertEqual(review.reviewer_username(), | 153 | self.assertEqual(review.reviewer_username(), |
569 | @@ -166,13 +166,13 @@ | |||
570 | 166 | origin=review.repository.origin, | 166 | origin=review.repository.origin, |
571 | 167 | distroseries=review.repository.distroseries, | 167 | distroseries=review.repository.distroseries, |
572 | 168 | packagename=review.package_name(), | 168 | packagename=review.package_name(), |
574 | 169 | appname=review.app_name(), | 169 | appname=str(review.app_name), |
575 | 170 | version=review.version | 170 | version=review.version |
576 | 171 | ) | 171 | ) |
577 | 172 | 172 | ||
578 | 173 | self.assertEqual(1, len(reviews)) | 173 | self.assertEqual(1, len(reviews)) |
579 | 174 | self.assertEqual(review.package_name(), reviews[0].package_name) | 174 | self.assertEqual(review.package_name(), reviews[0].package_name) |
581 | 175 | self.assertEqual(review.app_name(), reviews[0].app_name) | 175 | self.assertEqual(review.app_name, reviews[0].app_name) |
582 | 176 | self.assertEqual(review.summary, reviews[0].summary) | 176 | self.assertEqual(review.summary, reviews[0].summary) |
583 | 177 | self.assertEqual(review.version, reviews[0].version) | 177 | self.assertEqual(review.version, reviews[0].version) |
584 | 178 | 178 |