Skip to content

Commit

Permalink
Merge branch 'install'
Browse files Browse the repository at this point in the history
  • Loading branch information
jbalogh committed Mar 19, 2010
2 parents 6b4183a + ce1de12 commit 24a7a7a
Show file tree
Hide file tree
Showing 19 changed files with 250 additions and 98 deletions.
123 changes: 98 additions & 25 deletions apps/addons/buttons.py
Expand Up @@ -3,22 +3,34 @@
from l10n import ugettext as _, ugettext_lazy as _lazy

import amo
from amo.helpers import urlparams
from addons.models import Addon


@jinja2.contextfunction
def install_button(context, addon, version=None, show_eula=True):
def install_button(context, addon, version=None, show_eula=True,
show_contrib=True, show_warning=True, src='',
collection=None):
"""If version isn't given, we use the latest version."""
request = context['request']
app, lang = context['APP'], context['LANG']
button = install_button_factory(addon, app, lang, version, show_eula)
show_eula = bool(request.GET.get('eula', show_eula))
src = src or context.get('src') or request.GET.get('src', '')
collection = (collection or context.get('collection')
or request.GET.get('collection')
or request.GET.get('collection_id')
or request.GET.get('collection_uuid'))
button = install_button_factory(addon, app, lang, version,
show_eula, show_contrib, show_warning,
src, collection)
c = {'button': button, 'addon': addon, 'version': button.version,
'APP': app}
t = jingo.env.get_template('addons/install-button.html').render(c)
t = jingo.env.get_template('addons/button.html').render(c)
return jinja2.Markup(t)


def install_button_factory(addon, app, lang, version=None, show_eula=True):
button = InstallButton(addon, app, lang, version, show_eula)
def install_button_factory(*args, **kwargs):
button = InstallButton(*args, **kwargs)
# Order matters. We want to highlight unreviewed before featured. They
# should be mutually exclusive, but you never know.
classes = (('unreviewed', UnreviewedInstallButton),
Expand All @@ -33,57 +45,95 @@ def install_button_factory(addon, app, lang, version=None, show_eula=True):


class InstallButton(object):
button_class = 'download'
install_class = ''
button_class = ['download']
install_class = []
install_text = ''

def __init__(self, addon, app, lang, version=None, show_eula=True):
def __init__(self, addon, app, lang, version=None, show_eula=True,
show_contrib=True, show_warning=True, src='', collection=None):
self.addon, self.app, self.lang = addon, app, lang
self.latest = version is None
self.version = version or addon.current_version
self.src = src
self.collection = collection

self.featured = addon.is_featured(app, lang)
self.unreviewed = addon.is_unreviewed() or self.version.is_unreviewed
self.self_hosted = addon.status == amo.STATUS_LISTED

self.show_eula = show_eula and addon.has_eula
self.show_contrib = (show_contrib and addon.takes_contributions
and addon.annoying == amo.CONTRIB_ROADBLOCK)
self.show_warning = show_warning and (self.unreviewed or
self.self_hosted)

def prepare(self):
"""Called after the class is set to manage eulas, contributions."""
if self.show_eula:
self.button_class = 'eula'
self.install_class += ' eula'
# Get a copy for this instance.
self.button_class = list(self.__class__.button_class)
self.install_class = list(self.__class__.install_class)
tests = (self.show_eula, 'eula'), (self.show_contrib, 'contrib')
for pred, cls in tests:
if bool(pred):
try:
self.button_class.remove('download')
except ValueError:
pass
self.button_class.append(cls)
self.install_class.append(cls)

def attrs(self):
rv = {}
addon = self.addon
if addon.takes_contributions and addon.annoying == amo.CONTRIB_AFTER:
rv['data-after'] = 'contrib'
if addon.type_id == amo.ADDON_SEARCH:
rv['data-search'] = 'true'
return rv

def links(self):
rv = []
for file in self.version.files.all():
platform = file.platform_id
url = file.latest_xpi_url()
url = (file.latest_xpi_url() if self.latest else
file.get_url_path(self.src))
if platform == amo.PLATFORM_ALL.id:
text, os = _('Download Now'), None
else:
text, os = _('Download'), amo.PLATFORMS[platform]
if self.show_eula:
text, url = _('Continue to Download →'), file.eula_url()
rv.append(Link(text, url, os, file))
elif self.show_contrib:
# The eula doesn't exist or has been hit already.
text = _('Continue to Download →')
roadblock = self.addon.meet_the_dev_url(extra='roadblock')
url = urlparams(roadblock, eula='')
rv.append(Link(text, self.fix_link(url), os, file))
return rv

def fix_link(self, url):
if self.src:
url = urlparams(url, src=self.src)
if self.collection:
url = urlparams(url, collection=self.collection)
return url


class FeaturedInstallButton(InstallButton):
install_class = 'featuredaddon'
install_class = ['featuredaddon']
install_text = _lazy(u'Featured', 'install_button')


class UnreviewedInstallButton(InstallButton):
install_class = 'unreviewed'
install_class = ['unreviewed']
install_text = _lazy(u'Not Reviewed', 'install_button')
button_class = 'download caution'
button_class = 'download caution'.split()


class SelfHostedInstallButton(InstallButton):
install_class = 'selfhosted'
install_class = ['selfhosted']
install_text = _lazy(u'Self Hosted', 'install_button')
button_class = 'go'
button_class = ['go']

def links(self):
return [Link(_('Continue to Website →'), self.addon.homepage)]
Expand Down Expand Up @@ -111,6 +161,9 @@ def _compat(min, max):
return {'min': {'version': min}, 'max': {'version': max}}

addons = []
normal_version = _compat('1.0', '10.0')
older_version = _compat('1.0', '2.0')
newer_version = _compat('9.0', '10.0')

# Featured.
featured = Addon.objects.featured(request.APP)
Expand All @@ -121,19 +174,19 @@ def _compat(min, max):
normal = Addon.objects.listed(request.APP).exclude(id__in=featured)
addon = normal[0]
addon.tag = 'normal'
addon.compatible_apps[request.APP] = _compat('1.0', '10.0')
addon.compatible_apps[request.APP] = normal_version
addons.append(addon)

# Older version.
addon = normal[0]
addon.tag = 'older version'
addon.compatible_apps[request.APP] = _compat('1.0', '2.0')
addon.compatible_apps[request.APP] = older_version
addons.append(addon)

# Newer version.
addon = normal[0]
addon.tag = 'newer version'
addon.compatible_apps[request.APP] = _compat('9.0', '10.0')
addon.compatible_apps[request.APP] = newer_version
addons.append(addon)

# Unreviewed.
Expand All @@ -146,8 +199,14 @@ def _compat(min, max):
addons[-1].tag = 'platformer'

# Incompatible Platform.
addons.append(Addon.objects.get(id=5308))
addons[-1].tag = 'windows-only'
def w(tag, version):
a = Addon.objects.get(id=5308)
a.tag = tag
a.compatible_apps[request.APP] = version
return a
addons.append(w('windows/linux-only', normal_version))
addons.append(w('windows/linux-only + older version', older_version))
addons.append(w('windows/linux-only + newer version', newer_version))

# Self-Hosted.
addons.append(Addon.objects.filter(status=amo.STATUS_LISTED,
Expand All @@ -157,14 +216,21 @@ def _compat(min, max):
# EULA.
addons.append(normal.filter(eula__isnull=False)[0])
addons[-1].tag = 'eula'
addons.append(exp.filter(eula__isnull=False)
.exclude(eula__localized_string='')[0])
addons[-1].tag = 'eula + unreviewed'

# Contributions.
addons.append(normal.filter(annoying=1)[0])
addons[-1].tag = 'contrib: passive'
addons.append(normal.filter(annoying=2)[0])
addons[-1].tag = 'contrib: post'
addons[-1].tag = 'contrib: after'
addons.append(normal.filter(annoying=3)[0])
addons[-1].tag = 'contrib: roadblock'
addons.append(Addon.objects.get(id=2608))
addons[-1].tag = 'after + eula'
addons.append(Addon.objects.get(id=8442))
addons[-1].tag = 'roadblock + eula'

# Other App.
addons.append(Addon.objects.get(id=5326))
Expand All @@ -175,10 +241,17 @@ def _compat(min, max):
addons[-1].tag = 'mobile'

# Search Engine.
addons.append(Addon.objects.filter(type=amo.ADDON_SEARCH)[0])
addons[-1].tag = 'search engine'

# Beta Version
beta = normal.filter(versions__files__status=amo.STATUS_BETA)[0]
beta.tag = 'beta version'

# Theme.
# Persona.
# Future Version.
# No versions.

return jingo.render(request, 'addons/smorgasbord.html',
{'addons': addons})
{'addons': addons, 'beta': beta})
2 changes: 1 addition & 1 deletion apps/addons/helpers.py
Expand Up @@ -80,5 +80,5 @@ def contribution(addon, text='', src='', show_install=False, show_help=True):
'show_install': show_install,
'show_help': show_help,
'has_suggested': bool(addon.suggested_amount),
'pledge': pledge
'pledge': pledge,
}))
18 changes: 5 additions & 13 deletions apps/addons/models.py
Expand Up @@ -101,13 +101,7 @@ def compatible_with_platform(self, platform):

class Addon(amo.models.ModelBase):
STATUS_CHOICES = amo.STATUS_CHOICES.items()

CONTRIBUTIONS_CHOICES = (
(0, 'None'),
(1, 'Passive; user shown message next to download button'),
(2, 'User shown splash screen after download'),
(3, 'Roadblock; User shown splash screen before download'),
)
CONTRIB_CHOICES = sorted(amo.CONTRIB_CHOICES.items())

guid = models.CharField(max_length=255, unique=True, null=True)
name = TranslatedField()
Expand Down Expand Up @@ -186,8 +180,7 @@ class Addon(amo.models.ModelBase):
nullify_invalid=True,
blank=True, null=True,
help_text="Requested donation amount.")
annoying = models.PositiveIntegerField(choices=CONTRIBUTIONS_CHOICES,
default=0)
annoying = models.PositiveIntegerField(choices=CONTRIB_CHOICES, default=0)
enable_thankyou = models.BooleanField(default=False,
help_text="Should the thankyou note be sent to contributors?")
thankyou_note = TranslatedField()
Expand All @@ -211,10 +204,9 @@ def __unicode__(self):
def get_url_path(self):
return reverse('addons.detail', args=(self.id,))

@property
def meet_developers_url(self):
# TODO(davedash): reverse when developers pages are build
return self.get_url_path() + 'developers'
def meet_the_dev_url(self, extra=None):
args = [self.id, extra] if extra else [self.id]
return reverse('addons.meet', args=args)

@property
def reviews_url(self):
Expand Down
Expand Up @@ -5,25 +5,34 @@

{% set compat = addon.compatible_apps[APP] %}
<div class="install-shell">
<div class="install {{ b.install_class }}"
<div class="install {{ b.install_class|join(' ') }}"
data-addon="{{ addon.id }}"
data-icon="{{ addon.icon_url }}"
data-developers="{{ addon.meet_the_dev_url() }}"
data-name="{{ addon.name }}"
{{ b.attrs()|xmlattr }}
{% if compat %}
data-min="{{ compat.min.version }}"
data-max="{{ compat.max.version }}"
data-min="{{ compat.min.version }}"
data-max="{{ compat.max.version }}"
{% endif %}>
<p class="install-button">
{% for link in b.links() %}
<a class="button {{ b.button_class }} {{ link.os.shortname }}"
<a class="button {{ b.button_class|join(' ') }} {{ link.os.shortname }}"
data-hash="{{ link.file.hash }}"
href="{{ link.url }}">
{% if b.show_warning %}
href="{{ b.addon.get_url_path() }}"
data-realurl="{{ link.url }}"
{% else %}
href="{{ link.url }}"
{% endif %}>
<b></b>
<span>
{{ link.text|safe }}
{% if link.os %}
{# L10n: {0} is a platform name like Windows or Mac OS X. #}
<span class="os">{{ _('for {0}')|f(link.os.name) }}</span>
<span class="os" data-os="{{ link.os.name }}">
{{ _('for {0}')|f(link.os.name) }}
</span>
{% endif %}
</span>
</a>
Expand Down
7 changes: 4 additions & 3 deletions apps/addons/templates/addons/details.html
Expand Up @@ -30,7 +30,7 @@ <h4 class="author">{{ _('by') }} {{ users_list(addon.listed_authors) }}</h4>
<div id="addon-summary" class="primary {{ addon|statusflags }}">
<p{{ addon.summary|locale_html }}>{{ addon.summary|nl2br }}</p>

{{ install_button(addon) }}
{{ install_button(addon, show_warning=False) }}

{% if addon.takes_contributions %}
{{
Expand Down Expand Up @@ -158,7 +158,8 @@ <h4 id="beta-channel">{{ _('Beta Channel') }}</h4>
<dl>
<dt class="beta-version">{{ _('Version {0}:')|f(
addon.current_beta_version.version) }}</dt>
<dd>{{ install_button(addon, version=addon.current_beta_version) }}</dd>
<dd>{{ install_button(addon, version=addon.current_beta_version,
show_warning=False) }}</dd>
</dl>
</div>{# /install-beta #}
</div>
Expand Down Expand Up @@ -332,7 +333,7 @@ <h3 class="compact-bottom">
<p>{{ _("Learn why {0} was created and find out what's next for this "
'add-on.')|f(addon.name) }}</p>
<p>
<a class="more-info" href="{{ addon.meet_developers_url }}">
<a class="more-info" href="{{ addon.meet_the_dev_url() }}">
{% if addon.listed_authors|length > 1 %}
{{ _('Meet the Developers') }}
{% else %}
Expand Down
8 changes: 8 additions & 0 deletions apps/addons/templates/addons/eula.html
@@ -0,0 +1,8 @@
{% extends "base_side_categories.html" %}

{% block title %}{{ page_title(_('Eula for {0}')|f(addon.name)) }}{% endblock %}

{% block content %}
<h2>{{ _('Eula for {0}')|f(addon.name) }}</h2>
{{ install_button(addon, show_eula=False, show_warning=False) }}
{% endblock content %}
10 changes: 10 additions & 0 deletions apps/addons/templates/addons/meet_the_developer.html
@@ -0,0 +1,10 @@
{% extends "base.html" %}

{% block title %}
{{ page_title(_('Meet the {0} Developer')|f(addon.name)) }}
{% endblock %}

{% block content %}
<h2>{{ _('Meet the {0} Developer')|f(addon.name) }}</h2>
{{ install_button(addon, show_contrib=False) }}
{% endblock content %}

0 comments on commit 24a7a7a

Please sign in to comment.