Skip to content
This repository has been archived by the owner on Feb 7, 2022. It is now read-only.

Commit

Permalink
Fix #32: remove labels functionality (#35)
Browse files Browse the repository at this point in the history
  • Loading branch information
zgoda committed Mar 6, 2019
1 parent 6b3de3c commit 65299a8
Show file tree
Hide file tree
Showing 18 changed files with 9 additions and 377 deletions.
39 changes: 2 additions & 37 deletions brewlog/brew/views.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
from datetime import datetime

from flask import (
abort, flash, redirect, render_template, render_template_string, request,
url_for,
)
from flask import abort, flash, redirect, render_template, request, url_for
from flask_babel import gettext as _
from flask_babel import lazy_gettext
from flask_login import current_user, login_required
from markdown import markdown

from . import brew_bp
from ..ext import db
from ..forms.base import DeleteForm
from ..forms.utils import process_success
from ..models import Brew, CustomLabelTemplate
from ..models import Brew
from ..utils.pagination import get_page
from ..utils.views import next_redirect
from .forms import BrewForm, ChangeStateForm
Expand Down Expand Up @@ -102,37 +98,6 @@ def brew_print(brew_id):
return render_template('brew/print.html', **ctx)


@brew_bp.route('/<int:brew_id>/labels', endpoint='labels')
def brew_labels(brew_id):
brew = check_brew(brew_id, current_user, strict=True)
ctx = {
'brew': brew,
'custom_templates': [],
'rendered_cell': None,
'rows': 5,
'cols': 2,
'cell_style': 'width:90mm;height:50mm',
'current_template': 0,
}
if current_user.is_authenticated:
ctx['custom_templates'] = current_user.custom_label_templates.order_by(CustomLabelTemplate.name).all()
use_template = request.args.get('template')
if use_template is not None:
template_obj = current_user.custom_label_templates.filter_by(id=use_template).one()
if template_obj is not None:
cs = 'width:%(width)smm;min-width:%(width)smm;height:%(height)smm;min-height:%(height)s' % \
{'width': template_obj.width, 'height': template_obj.height}
custom_data = dict(
rendered_cell=render_template_string(markdown(template_obj.text, safe_mode='remove'), brew=brew),
rows=template_obj.rows,
cols=template_obj.cols,
cell_style=cs,
current_template=template_obj.id,
)
ctx.update(custom_data)
return render_template('brew/labels.html', **ctx)


@brew_bp.route('/<int:brew_id>/delete', methods=['GET', 'POST'], endpoint='delete')
@login_required
def brew_delete(brew_id):
Expand Down
2 changes: 1 addition & 1 deletion brewlog/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
from .brewing import Brew # noqa
from .fermentation import FermentationStep # noqa
from .tasting import TastingNote # noqa
from .users import BrewerProfile, CustomLabelTemplate # noqa
from .users import BrewerProfile # noqa
28 changes: 0 additions & 28 deletions brewlog/models/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,31 +96,3 @@ def profile_pre_save(mapper, connection, target):

db.event.listen(BrewerProfile, 'before_insert', profile_pre_save)
db.event.listen(BrewerProfile, 'before_update', profile_pre_save)


class CustomLabelTemplate(db.Model, DefaultModelMixin):
__tablename__ = 'custom_label_template'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('brewer_profile.id'), nullable=False)
user = db.relationship(
'BrewerProfile',
backref=db.backref(
'custom_label_templates', cascade='all,delete', lazy='dynamic',
order_by='CustomLabelTemplate.name'
)
)
name = db.Column(db.String(100), nullable=False)
cols = db.Column(db.Integer, nullable=False, default=2)
rows = db.Column(db.Integer, nullable=False, default=5)
width = db.Column(db.Integer, default=90, server_default='90', nullable=False)
height = db.Column(db.Integer, default=50, server_default='50', nullable=False)
text = db.Column(db.Text)
is_default = db.Column(db.Boolean, default=False)

__table_args__ = (
db.Index('user_label_template', 'user_id', 'name'),
)

@property
def absolute_url(self):
return url_for('profile.label_template', tid=self.id, user_id=self.user.id)
29 changes: 1 addition & 28 deletions brewlog/profile/forms.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import wtforms as wf
from flask import flash, redirect
from flask_babel import lazy_gettext as _
from wtforms.validators import DataRequired, Email

from ..forms.base import BaseObjectForm
from ..models import CustomLabelTemplate


class ProfileForm(BaseObjectForm):
Expand All @@ -22,29 +20,4 @@ class ProfileForm(BaseObjectForm):
)

def save(self, obj):
return super(ProfileForm, self).save(obj, save=True)


class CustomTemplateForm(BaseObjectForm):

def save_and_redirect(self, user, obj=None):
obj = self.save(user, obj)
flash(_('your template %(name)s has been saved', name=obj.name), category='success')
return redirect(obj.absolute_url)


class CustomLabelTemplateForm(CustomTemplateForm):
name = wf.StringField(_('name'), validators=[DataRequired()])
cols = wf.IntegerField(_('columns'), validators=[DataRequired()], default=2)
rows = wf.IntegerField(_('rows'), validators=[DataRequired()], default=5)
width = wf.IntegerField(_('label width'), validators=[DataRequired()], default=90,
description=_('single label cell width in milimetres'))
height = wf.IntegerField(_('label height'), validators=[DataRequired()], default=50,
description=_('single label cell height in milimetres'))
text = wf.TextAreaField(_('text'), validators=[DataRequired()], description=_('template text'))
is_default = wf.BooleanField(_('default'), default=False)

def save(self, user, obj=None):
if obj is None:
obj = CustomLabelTemplate(user=user)
return super(CustomLabelTemplateForm, self).save(obj, save=True)
return super().save(obj, save=True)
29 changes: 2 additions & 27 deletions brewlog/profile/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@
from ..brew.utils import BrewUtils
from ..ext import db
from ..forms.base import DeleteForm
from ..models import Brew, BrewerProfile, Brewery, CustomLabelTemplate
from ..profile.forms import CustomLabelTemplateForm, ProfileForm
from ..models import Brew, BrewerProfile, Brewery
from ..profile.forms import ProfileForm
from ..utils.pagination import get_page
from ..utils.views import get_user_object


@profile_bp.route('/<int:user_id>', methods=['GET', 'POST'], endpoint='details')
Expand Down Expand Up @@ -102,27 +101,3 @@ def brews(user_id):
'utils': BrewUtils,
}
return render_template('brew/list.html', **ctx)


@profile_bp.route(
'/<int:user_id>/lbtemplate',
methods=['GET', 'POST'], defaults={'tid': None},
endpoint='label_template_add'
)
@profile_bp.route(
'/<int:user_id>/lbtemplate/<int:tid>',
methods=['GET', 'POST'],
endpoint='label_template'
)
@login_required
def label_template(user_id, tid=None):
template = get_user_object(CustomLabelTemplate, tid)
form = CustomLabelTemplateForm()
if form.validate_on_submit():
return form.save_and_redirect(current_user, template)
form = CustomLabelTemplateForm(obj=template)
ctx = {
'form': form,
'template': template,
}
return render_template('account/label_template.html', **ctx)
8 changes: 0 additions & 8 deletions brewlog/static/css/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,6 @@ textarea.export, textarea#text {
line-height: 1.1em;
}

table.printlabel td {
width: 9cm;
height: 5cm;
text-align: center;
vertical-align: center;
border: 1px solid black;
}

.required label {
font-weight: bold;
}
Expand Down
34 changes: 0 additions & 34 deletions brewlog/templates/account/label_template.html

This file was deleted.

8 changes: 0 additions & 8 deletions brewlog/templates/account/profile.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,6 @@ <h3>{{ gettext("Brewer profile for user %(name)s", name=profile.name) }}</h3>
</form>
<h3>{{ gettext("delete account").capitalize() }}</h3>
<p><a href="{{ url_for('profile.delete', user_id=profile.id) }}" class="btn btn-danger">{{ gettext("delete my account") }}</a></p>
<h3>{{ gettext("user customizations").capitalize() }}</h3>
<h4>{{ gettext("custom label templates").capitalize() }}</h4>
{% if profile.custom_label_templates %}
<ul>
{% for template in profile.custom_label_templates %}<li><a href="{{ template.absolute_url }}">{{ template.name }}</a></li>{% endfor %}
</ul>
{% endif %}
<p><a href="{{ url_for('profile.label_template_add', user_id=profile.id) }}" class="btn btn-primary">{{ gettext("add new template") }}</a></p>
{% endif %}
{% endblock %}

Expand Down
1 change: 0 additions & 1 deletion brewlog/templates/brew/details.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{% trans %}recipe tools{% endtrans %} <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ url_for('brew.print', brew_id=brew.id) }}">{{ gettext("print recipe") }}</a></li>
<li><a href="{{ url_for('brew.labels', brew_id=brew.id) }}">{{ gettext("print labels") }}</a></li>
</ul>
</li>
{% endblock %}
Expand Down
4 changes: 0 additions & 4 deletions brewlog/templates/brew/include/label.html

This file was deleted.

36 changes: 0 additions & 36 deletions brewlog/templates/brew/labels.html

This file was deleted.

33 changes: 0 additions & 33 deletions brewlog/utils/views.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,4 @@
from flask import request, session, url_for
from flask_login import current_user
from werkzeug.exceptions import Forbidden


def get_user_object(klass, object_id=None, user=None, raise_403=True):
"""Get object (model) of specified class related to user. If the object
does not pertain to specified user, :exc:`werkzeug.exceptions.Forbidden`
may be raised.
:param klass: requested object class
:type klass: class
:param object_id: object identifier, defaults to None
:type object_id: mixed, optional
:param user: user object; if not specified :obj:`current_user` is used,
defaults to None
:type user: :class:`models.users.BrewerProfile`, optional
:param raise_403: whether to raise Forbidden, defaults to True
:type raise_403: bool, optional
:raises Forbidden: if user is not an owner of the object
:return: requested object
:rtype: mixed
"""

if object_id is None:
return
if user is None:
user = current_user
obj = klass.query.get_or_404(object_id)
if obj.user != user:
if raise_403:
raise Forbidden()
return
return obj


def next_redirect(fallback_endpoint, *args, **kwargs):
Expand Down
5 changes: 2 additions & 3 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@
from brewlog.ext import db

from .factories import (
BreweryFactory, BrewFactory, FermentationStepFactory, LabelTemplateFactory,
TastingNoteFactory, UserFactory,
BreweryFactory, BrewFactory, FermentationStepFactory, TastingNoteFactory,
UserFactory,
)

register(UserFactory)
register(LabelTemplateFactory)
register(BreweryFactory)
register(BrewFactory)
register(FermentationStepFactory)
Expand Down
1 change: 0 additions & 1 deletion tests/factories/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@
BrewFactory, BreweryFactory, FermentationStepFactory,
TastingNoteFactory
)
from .tools import LabelTemplateFactory # noqa
from .user import UserFactory # noqa
18 changes: 0 additions & 18 deletions tests/factories/tools.py

This file was deleted.

Loading

0 comments on commit 65299a8

Please sign in to comment.