Skip to content
This repository was archived by the owner on Mar 15, 2018. It is now read-only.

Commit 8abcaac

Browse files
committed
Remove tags from edit app screen (bug 726763)
1 parent 16878fe commit 8abcaac

File tree

4 files changed

+67
-159
lines changed

4 files changed

+67
-159
lines changed

mkt/developers/forms.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import amo
2424
import addons.forms
25+
from addons.forms import clean_name, slug_validator
2526
import paypal
2627
from addons.models import (Addon, AddonDependency, AddonUpsell, AddonUser,
2728
BlacklistedSlug, Charity, Preview)
@@ -1167,3 +1168,65 @@ def clean(self):
11671168
FormSet = modelformset_factory(AddonDependency, formset=_FormSet,
11681169
form=_Form, extra=0, can_delete=True)
11691170
return FormSet(*args, **kw)
1171+
1172+
1173+
class AppFormBasic(addons.forms.AddonFormBase):
1174+
"""Form to edit basic app info."""
1175+
name = TransField(max_length=128)
1176+
slug = forms.CharField(max_length=30)
1177+
summary = TransField(widget=TransTextarea(attrs={'rows': 4}),
1178+
max_length=250)
1179+
1180+
class Meta:
1181+
model = Addon
1182+
fields = ('name', 'slug', 'summary')
1183+
1184+
def __init__(self, *args, **kw):
1185+
# Force the form to use app_slug if this is a webapp. We want to keep
1186+
# this under "slug" so all the js continues to work.
1187+
if kw['instance'].is_webapp():
1188+
kw.setdefault('initial', {})['slug'] = kw['instance'].app_slug
1189+
1190+
super(AppFormBasic, self).__init__(*args, **kw)
1191+
# Do not simply append validators, as validators will persist between
1192+
# instances.
1193+
validate_name = lambda x: clean_name(x, self.instance)
1194+
name_validators = list(self.fields['name'].validators)
1195+
name_validators.append(validate_name)
1196+
self.fields['name'].validators = name_validators
1197+
1198+
def _post_clean(self):
1199+
# Switch slug to app_slug in cleaned_data and self._meta.fields so
1200+
# we can update the app_slug field for webapps.
1201+
try:
1202+
self._meta.fields = list(self._meta.fields)
1203+
slug_idx = self._meta.fields.index('slug')
1204+
data = self.cleaned_data
1205+
if 'slug' in data:
1206+
data['app_slug'] = data.pop('slug')
1207+
self._meta.fields[slug_idx] = 'app_slug'
1208+
super(AppFormBasic, self)._post_clean()
1209+
finally:
1210+
self._meta.fields[slug_idx] = 'slug'
1211+
1212+
def clean_slug(self):
1213+
target = self.cleaned_data['slug']
1214+
slug_validator(target, lower=False)
1215+
slug_field = 'app_slug' if self.instance.is_webapp() else 'slug'
1216+
1217+
if target != getattr(self.instance, slug_field):
1218+
if Addon.objects.filter(**{slug_field: target}).exists():
1219+
raise forms.ValidationError(_('This slug is already in use.'))
1220+
1221+
if BlacklistedSlug.blocked(target):
1222+
raise forms.ValidationError(_('The slug cannot be: %s.'
1223+
% target))
1224+
return target
1225+
1226+
def save(self, addon, commit=False):
1227+
# We ignore `commit`, since we need it to be `False` so we can save
1228+
# the ManyToMany fields on our own.
1229+
addonform = super(AppFormBasic, self).save(commit=False)
1230+
addonform.save()
1231+
1232+
return addonform

mkt/developers/templates/developers/addons/edit/basic.html

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -175,44 +175,6 @@ <h3>
175175
</td>
176176
</tr>
177177
{% endif %}
178-
<tr>
179-
<th>
180-
{% if webapp %}
181-
{# TODO(apps): Finalize copy. #}
182-
{{ tip('Tags',
183-
"Tags help users find your app and should be short
184-
descriptors such as tabs, toolbar, or twitter. You
185-
may have a maximum of {0} tags.".format(amo.MAX_TAGS)) }}
186-
{% else %}
187-
{{ tip(_("Tags"),
188-
_("Tags help users find your add-on and should be short
189-
descriptors such as tabs, toolbar, or twitter. You
190-
may have a maximum of {0} tags.").format(amo.MAX_TAGS)) }}
191-
{% endif %}
192-
</th>
193-
<td id="addon_tags_edit">
194-
{% if editable %}
195-
{{ form.tags }}
196-
{{ form.tags.errors }}
197-
<div class="edit-addon-details">
198-
{{ ngettext('Comma-separated, minimum of {0} character.',
199-
'Comma-separated, minimum of {0} characters.',
200-
amo.MIN_TAG_LENGTH)|f(amo.MIN_TAG_LENGTH) }}
201-
{{ _('Example: pop, hen, yum. Limit 20.') }}
202-
</div>
203-
{% if restricted_tags %}
204-
<div class="edit-addon-details">
205-
{{ ngettext('Reserved tag:', 'Reserved tags:', restricted_tags|length) }}
206-
{{ restricted_tags|join(', ') }}
207-
</div>
208-
{% endif %}
209-
{% else %}
210-
{% call empty_unless(tags) %}
211-
{{ tags|join(', ') }}
212-
{% endcall %}
213-
{% endif %}
214-
</td>
215-
</tr>
216178
</tbody>
217179
</table>
218180
</div>

mkt/developers/tests/test_views_edit.py

Lines changed: 1 addition & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
AddonDeviceType, AddonUser, Category, DeviceType)
2424
from bandwagon.models import Collection, CollectionAddon, FeaturedCollection
2525
from mkt.developers.models import ActivityLog
26-
from tags.models import Tag, AddonTag
2726
from users.models import UserProfile
2827

2928

@@ -53,10 +52,6 @@ def setUp(self):
5352
self.url = addon.get_dev_url()
5453
self.user = UserProfile.objects.get(pk=55021)
5554

56-
self.tags = ['tag3', 'tag2', 'tag1']
57-
for t in self.tags:
58-
Tag(tag_text=t).save_tag(addon)
59-
6055
self.addon = self.get_addon()
6156

6257
def get_addon(self):
@@ -68,8 +63,7 @@ def get_url(self, section, edit=False):
6863
def get_dict(self, **kw):
6964
fs = formset(self.cat_initial, initial_count=1)
7065
result = {'name': 'new name', 'slug': 'test_slug',
71-
'summary': 'new summary',
72-
'tags': ', '.join(self.tags)}
66+
'summary': 'new summary'}
7367
result.update(**kw)
7468
result.update(fs)
7569
return result
@@ -266,8 +260,6 @@ def test_edit(self):
266260
eq_(unicode(addon.slug), data['slug'])
267261
eq_(unicode(addon.summary), data['summary'])
268262

269-
eq_([unicode(t) for t in addon.tags.all()], sorted(self.tags))
270-
271263
def test_edit_check_description(self):
272264
# Make sure bug 629779 doesn't return.
273265
old_desc = self.addon.description
@@ -330,8 +322,6 @@ def test_edit_as_developer(self):
330322
eq_(unicode(addon.slug), data['slug'])
331323
eq_(unicode(addon.summary), data['summary'])
332324

333-
eq_([unicode(t) for t in addon.tags.all()], sorted(self.tags))
334-
335325
def test_edit_name_required(self):
336326
data = self.get_dict(name='', slug='test_addon')
337327
r = self.client.post(self.basic_edit_url, data)
@@ -351,104 +341,6 @@ def test_edit_slugs_unique(self):
351341
eq_(r.status_code, 200)
352342
self.assertFormError(r, 'form', 'slug', 'This slug is already in use.')
353343

354-
def test_edit_add_tag(self):
355-
count = ActivityLog.objects.all().count()
356-
self.tags.insert(0, 'tag4')
357-
data = self.get_dict()
358-
r = self.client.post(self.basic_edit_url, data)
359-
eq_(r.status_code, 200)
360-
361-
result = pq(r.content)('#addon_tags_edit').eq(0).text()
362-
363-
eq_(result, ', '.join(sorted(self.tags)))
364-
eq_((ActivityLog.objects.for_addons(self.addon)
365-
.get(action=amo.LOG.ADD_TAG.id)).to_string(),
366-
'<a href="/en-US/firefox/tag/tag4">tag4</a> added to '
367-
'<a href="/en-US/firefox/addon/test_slug/">new name</a>.')
368-
eq_(ActivityLog.objects.filter(action=amo.LOG.ADD_TAG.id).count(),
369-
count + 1)
370-
371-
def test_edit_blacklisted_tag(self):
372-
Tag.objects.get_or_create(tag_text='blue', blacklisted=True)
373-
data = self.get_dict(tags='blue')
374-
r = self.client.post(self.basic_edit_url, data)
375-
eq_(r.status_code, 200)
376-
377-
error = 'Invalid tag: blue'
378-
self.assertFormError(r, 'form', 'tags', error)
379-
380-
def test_edit_blacklisted_tags_2(self):
381-
Tag.objects.get_or_create(tag_text='blue', blacklisted=True)
382-
Tag.objects.get_or_create(tag_text='darn', blacklisted=True)
383-
data = self.get_dict(tags='blue, darn, swearword')
384-
r = self.client.post(self.basic_edit_url, data)
385-
eq_(r.status_code, 200)
386-
387-
error = 'Invalid tags: blue, darn'
388-
self.assertFormError(r, 'form', 'tags', error)
389-
390-
def test_edit_blacklisted_tags_3(self):
391-
Tag.objects.get_or_create(tag_text='blue', blacklisted=True)
392-
Tag.objects.get_or_create(tag_text='darn', blacklisted=True)
393-
Tag.objects.get_or_create(tag_text='swearword', blacklisted=True)
394-
data = self.get_dict(tags='blue, darn, swearword')
395-
r = self.client.post(self.basic_edit_url, data)
396-
eq_(r.status_code, 200)
397-
398-
error = 'Invalid tags: blue, darn, swearword'
399-
self.assertFormError(r, 'form', 'tags', error)
400-
401-
def test_edit_remove_tag(self):
402-
self.tags.remove('tag2')
403-
404-
count = ActivityLog.objects.all().count()
405-
data = self.get_dict()
406-
r = self.client.post(self.basic_edit_url, data)
407-
eq_(r.status_code, 200)
408-
409-
result = pq(r.content)('#addon_tags_edit').eq(0).text()
410-
411-
eq_(result, ', '.join(sorted(self.tags)))
412-
413-
eq_(ActivityLog.objects.filter(action=amo.LOG.REMOVE_TAG.id).count(),
414-
count + 1)
415-
416-
def test_edit_minlength_tags(self):
417-
tags = self.tags
418-
tags.append('a' * (amo.MIN_TAG_LENGTH - 1))
419-
data = self.get_dict()
420-
r = self.client.post(self.basic_edit_url, data)
421-
eq_(r.status_code, 200)
422-
423-
self.assertFormError(r, 'form', 'tags',
424-
'All tags must be at least %d characters.' %
425-
amo.MIN_TAG_LENGTH)
426-
427-
def test_edit_max_tags(self):
428-
tags = self.tags
429-
430-
for i in range(amo.MAX_TAGS + 1):
431-
tags.append('test%d' % i)
432-
433-
data = self.get_dict()
434-
r = self.client.post(self.basic_edit_url, data)
435-
self.assertFormError(r, 'form', 'tags', 'You have %d too many tags.' %
436-
(len(tags) - amo.MAX_TAGS))
437-
438-
def test_edit_tag_empty_after_slug(self):
439-
start = Tag.objects.all().count()
440-
data = self.get_dict(tags='>>')
441-
self.client.post(self.basic_edit_url, data)
442-
443-
# Check that the tag did not get created.
444-
eq_(start, Tag.objects.all().count())
445-
446-
def test_edit_tag_slugified(self):
447-
data = self.get_dict(tags='<script>alert("foo")</script>')
448-
self.client.post(self.basic_edit_url, data)
449-
tag = Tag.objects.all().order_by('-pk')[0]
450-
eq_(tag.tag_text, 'scriptalertfooscript')
451-
452344
def test_edit_categories_add(self):
453345
eq_([c.id for c in self.get_addon().all_categories], [22])
454346
self.cat_initial['categories'] = [22, 23]
@@ -598,16 +490,6 @@ def test_edit_summary_max_length(self):
598490
'Ensure this value has at most 250 '
599491
'characters (it has 251).')
600492

601-
def test_edit_restricted_tags(self):
602-
addon = self.get_addon()
603-
tag = Tag.objects.create(tag_text='restartless', restricted=True)
604-
AddonTag.objects.create(tag=tag, addon=addon)
605-
606-
res = self.client.get(self.basic_edit_url)
607-
divs = pq(res.content)('#addon_tags_edit .edit-addon-details')
608-
eq_(len(divs), 2)
609-
assert 'restartless' in divs.eq(1).text()
610-
611493
def test_text_not_none_when_has_flags(self):
612494
r = self.client.get(self.url)
613495
doc = pq(r.content)

mkt/developers/views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
from addons.models import Addon, AddonUser
4040
from addons.views import BaseFilter
4141
from mkt.developers.decorators import dev_required
42-
from mkt.developers.forms import CheckCompatibilityForm, InappConfigForm
42+
from mkt.developers.forms import (CheckCompatibilityForm, InappConfigForm,
43+
AppFormBasic)
4344
from mkt.developers.models import ActivityLog, SubmitStep
4445
from mkt.developers import perf
4546
from editors.helpers import get_position
@@ -889,7 +890,7 @@ def ajax_dependencies(request, addon_id, addon):
889890
@dev_required(webapp=True)
890891
def addons_section(request, addon_id, addon, section, editable=False,
891892
webapp=False):
892-
basic = addon_forms.AppFormBasic if webapp else addon_forms.AddonFormBasic
893+
basic = AppFormBasic if webapp else addon_forms.AddonFormBasic
893894
models = {'basic': basic,
894895
'media': addon_forms.AddonFormMedia,
895896
'details': addon_forms.AddonFormDetails,

0 commit comments

Comments
 (0)