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

Commit

Permalink
Add developer_name column to Version and update its content from mani…
Browse files Browse the repository at this point in the history
…fest
  • Loading branch information
diox committed Jun 12, 2013
1 parent cd8a9ac commit 3faa9a2
Show file tree
Hide file tree
Showing 25 changed files with 291 additions and 14 deletions.
5 changes: 4 additions & 1 deletion apps/devhub/tests/addons/badicon.webapp
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@
"version": "1.0",
"name": "MozillaBall",
"description": "Exciting Open Web development action!",
"icons": {}
"icons": {},
"developer": {
"name": "Bad Icon Developer"
}
}
3 changes: 3 additions & 0 deletions apps/devhub/tests/addons/dataicon.webapp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
"description": "The New York Times Open Web App",
"icons": {
"48": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkMwMkQ0QkNDRkQxMTFERjg0RTJGOUU0QkI1M0FBOEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkMwMkQ0QkRDRkQxMTFERjg0RTJGOUU0QkI1M0FBOEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBNEQ1QTM3MUNGQzMxMURGODRFMkY5RTRCQjUzQUE4QyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBNEQ1QTM3MkNGQzMxMURGODRFMkY5RTRCQjUzQUE4QyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv1BHf0AAAsnSURBVHjazJp3iBTL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"
},
"developer": {
"name": "Data Icon Developer"
}
}

9 changes: 9 additions & 0 deletions apps/files/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,18 @@ def parse(self, fileorpath):
'description', default='')
if 'description' in data:
localized_descr.update({default_locale: data['description']})
developer_info = data.get('developer', {})
developer_name = developer_info.get('name')
if not developer_name:
# Missing developer name shouldn't happen if validation took place,
# but let's be explicit about this just in case.
raise forms.ValidationError(
_("Developer name is required in the manifest in order to "
"display it on the app's listing."))
return {'guid': None,
'type': amo.ADDON_WEBAPP,
'name': {default_locale: data['name']},
'developer_name': developer_name,
'summary': self.trans_all_locales(localized_descr),
'version': data.get('version', '1.0'),
'default_locale': default_locale}
Expand Down
16 changes: 15 additions & 1 deletion apps/versions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ class Version(amo.models.ModelBase):

supported_locales = models.CharField(max_length=255)

_developer_name = models.CharField(max_length=255, default='',
editable=False)

objects = VersionManager()
with_deleted = VersionManager(include_deleted=True)

Expand Down Expand Up @@ -105,8 +108,10 @@ def from_upload(cls, upload, addon, platforms, send_signal=True):
license = addon.versions.latest().license_id
except Version.DoesNotExist:
license = None
max_len = cls._meta.get_field_by_name('_developer_name')[0].max_length
developer = data.get('developer_name', '')[:max_len]
v = cls.objects.create(addon=addon, version=data['version'],
license_id=license)
license_id=license, _developer_name=developer)
log.info('New version: %r (%s) from %r' % (v, v.id, upload))
# appversions
AV = ApplicationsVersions
Expand Down Expand Up @@ -451,6 +456,15 @@ def disable_old_files(self):
for f in qs:
f.update(status=amo.STATUS_DISABLED)

@property
def developer_name(self):
if self._developer_name:
return self._developer_name
elif self.addon.listed_authors:
return self.addon.listed_authors[0].name
else:
return ''


def update_status(sender, instance, **kw):
if not kw.get('raw'):
Expand Down
1 change: 1 addition & 0 deletions migrations/605-add-developer-name.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE `versions` ADD `_developer_name` varchar(255) NOT NULL DEFAULT '';
13 changes: 13 additions & 0 deletions mkt/developers/templates/developers/apps/edit/basic.html
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,19 @@ <h2>
{{ addon|all_locales('name') }}
</td>
</tr>
<tr id="developer-name">
<th>
<label data-for="developer_name">
{{ _('Developer Name') }}
{{ tip(None,
_('This field can only be edited by updating it in the '
'manifest.')) }}
</label>
</th>
<td>
{{ version.developer_name }}
</td>
</tr>
<tr>
<th>
{{ tip(_('App URL'),
Expand Down
3 changes: 3 additions & 0 deletions mkt/developers/tests/addons/badicon.webapp
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@
"name": "MozillaBall",
"description": "Exciting Open Web development action!",
"icons": {},
"developer": {
"name": "Bad Icon Developer"
}
}
3 changes: 3 additions & 0 deletions mkt/developers/tests/addons/dataicon.webapp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
"description": "The New York Times Open Web App",
"icons": {
"48": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkMwMkQ0QkNDRkQxMTFERjg0RTJGOUU0QkI1M0FBOEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkMwMkQ0QkRDRkQxMTFERjg0RTJGOUU0QkI1M0FBOEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBNEQ1QTM3MUNGQzMxMURGODRFMkY5RTRCQjUzQUE4QyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBNEQ1QTM3MkNGQzMxMURGODRFMkY5RTRCQjUzQUE4QyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv1BHf0AAAsnSURBVHjazJp3iBTL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"
},
"developer": {
"name": "Data Icon Developer"
}
}

17 changes: 17 additions & 0 deletions mkt/developers/tests/test_views_edit.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from django.conf import settings
from django.core.files.storage import default_storage as storage
from django.utils.encoding import smart_unicode

import mock
from nose import SkipTest
Expand Down Expand Up @@ -479,6 +480,22 @@ def test_refresh_dev_only(self, fetch):
eq_(r.status_code, 403)
eq_(fetch.called, 0)

def test_view_developer_name(self):
r = self.client.get(self.url)
developer_name = self.webapp.current_version.developer_name
content = smart_unicode(r.content)
eq_(pq(content)('#developer-name td').html().strip(), developer_name)

def test_view_developer_name_xss(self):
version = self.webapp.current_version
version._developer_name = '<script>alert("xss-devname")</script>'
version.save()

r = self.client.get(self.url)

assert '<script>alert' not in r.content
assert '&lt;script&gt;alert' in r.content


class TestEditCountryLanguage(TestEdit):

Expand Down
12 changes: 8 additions & 4 deletions mkt/developers/tests/test_views_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ def setUp(self):
f)
self.tmp_files = []
self.manifest = dict(name=u'Ivan Krsti\u0107', version=u'1.0',
description=u'summary')
description=u'summary',
developer=dict(name=u'Dev Namé'))

def tearDown(self):
for tmp in self.tmp_files:
Expand Down Expand Up @@ -94,12 +95,14 @@ def test_no_manifest_at_root(self):

def test_no_locales(self):
wp = WebAppParser().parse(self.webapp(dict(name='foo', version='1.0',
description='summary')))
description='summary',
developer=dict(name='bar'))))
eq_(wp['summary']['en-US'], u'summary')

def test_no_description(self):
wp = WebAppParser().parse(self.webapp(dict(name='foo',
version='1.0')))
version='1.0',
developer=dict(name='bar'))))
eq_(wp['summary'], {})

def test_syntax_error(self):
Expand All @@ -115,7 +118,8 @@ def test_utf8_bom(self):
eq_(wp['version'], '1.0')

def test_non_ascii(self):
wm = json.dumps({'name': u'まつもとゆきひろ', 'version': '1.0'},
wm = json.dumps(dict(name=u'まつもとゆきひろ', version='1.0',
developer=dict(name=u'まつもとゆきひろ')),
encoding='shift-jis')
wp = WebAppParser().parse(self.webapp(contents=wm))
eq_(wp['name'], {'en-US': u'まつもとゆきひろ'})
Expand Down
2 changes: 2 additions & 0 deletions mkt/developers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ def edit(request, addon_id, addon, webapp=False):
'tags': addon.tags.not_blacklisted().values_list('tag_text',
flat=True),
'previews': addon.get_previews(),
'version': addon.current_version or addon.latest_version
}
if (waffle.switch_is_active('buchets') and not addon.is_packaged and
addon.current_version):
Expand Down Expand Up @@ -692,6 +693,7 @@ def addons_section(request, addon_id, addon, section, editable=False,

data = {'addon': addon,
'webapp': webapp,
'version': addon.current_version or addon.latest_version,
'form': form,
'editable': editable,
'tags': tags,
Expand Down
50 changes: 50 additions & 0 deletions mkt/files/tests/test_utils_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import mock
from nose.tools import eq_

from django import forms

import amo.tests
from files.utils import WebAppParser


class TestWebAppParser(amo.tests.TestCase):

@mock.patch('files.utils.WebAppParser.get_json_data')
def test_no_developer_name(self, get_json_data):
get_json_data.return_value = {
'name': 'Blah'
}
with self.assertRaises(forms.ValidationError) as e:
# The argument to parse() is supposed to be a filename, it doesn't
# matter here though since we are mocking get_json_data().
WebAppParser().parse('')
eq_(e.exception.messages, ["Developer name is required in the manifest"
" in order to display it on the app's "
"listing."])

@mock.patch('files.utils.WebAppParser.get_json_data')
def test_empty_developer_object(self, get_json_data):
get_json_data.return_value = {
'name': 'Blah',
'developer': {}
}
with self.assertRaises(forms.ValidationError) as e:
# The argument to parse() is supposed to be a filename, it doesn't
# matter here though since we are mocking get_json_data().
WebAppParser().parse('')
eq_(e.exception.messages, ["Developer name is required in the manifest"
" in order to display it on the app's "
"listing."])

@mock.patch('files.utils.WebAppParser.get_json_data')
def test_developer_name(self, get_json_data):
get_json_data.return_value = {
'name': 'Blah',
'developer': {
'name': 'Mozilla Marketplace Testing'
}
}
# The argument to parse() is supposed to be a filename, it doesn't
# matter here though since we are mocking get_json_data().
parsed_results = WebAppParser().parse('')
eq_(parsed_results['developer_name'], 'Mozilla Marketplace Testing')
2 changes: 2 additions & 0 deletions mkt/reviewers/templates/reviewers/includes/details.html
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ <h2>{{ _('Details') }}</h2>
{{ product.homepage }}</a>
</dd>
{% endif %}
<dt>{{ _('Developer Name') }}</dt>
<dd>{{ version.developer_name }}</dd>
{% if product.compatible_apps[APP] %}
<dt>{{ _('Works with') }}</dt>
<dd>{{ product.compatible_apps[APP] }}</dd>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ <h2>{{ _('Details') }}</h2>
{{ product.homepage }}</a>
</dd>
{% endif %}
<dt>{{ _('Developer Name') }}</dt>
<dd>{{ version.developer_name }}</dd>
{% if product.compatible_apps[APP] %}
<dt>{{ _('Works with') }}</dt>
<dd>{{ product.compatible_apps[APP] }}</dd>
Expand Down
Loading

0 comments on commit 3faa9a2

Please sign in to comment.