diff --git a/ereuse_devicehub/inventory/forms.py b/ereuse_devicehub/inventory/forms.py index 14f93516..48484a1e 100644 --- a/ereuse_devicehub/inventory/forms.py +++ b/ereuse_devicehub/inventory/forms.py @@ -485,46 +485,6 @@ class NewDeviceForm(FlaskForm): return snapshot -class TagForm(FlaskForm): - code = StringField('Code', [validators.length(min=1)]) - - def validate(self, extra_validators=None): - error = ["This value is being used"] - is_valid = super().validate(extra_validators) - if not is_valid: - return False - tag = Tag.query.filter(Tag.id == self.code.data).all() - if tag: - self.code.errors = error - return False - - return True - - def save(self): - self.instance = Tag(id=self.code.data) - db.session.add(self.instance) - db.session.commit() - return self.instance - - def remove(self): - if not self.instance.device and not self.instance.provider: - self.instance.delete() - db.session.commit() - return self.instance - - -class TagUnnamedForm(FlaskForm): - amount = IntegerField('amount') - - def save(self): - num = self.amount.data - tags_id, _ = g.tag_provider.post('/', {}, query=[('num', num)]) - tags = [Tag(id=tag_id, provider=g.inventory.tag_provider) for tag_id in tags_id] - db.session.add_all(tags) - db.session.commit() - return tags - - class TagDeviceForm(FlaskForm): tag = SelectField('Tag', choices=[]) device = StringField('Device', [validators.Optional()]) @@ -1007,29 +967,3 @@ class TradeDocumentForm(FlaskForm): db.session.commit() return self._obj - - -class PrintTagsForm(FlaskForm): - devices = StringField(render_kw={'class': "devicesList d-none"}) - - def validate(self, extra_validators=None): - is_valid = super().validate(extra_validators) - - if not self.devices.data: - return False - - device_ids = self.devices.data.split(",") - self._devices = ( - Device.query.filter(Device.id.in_(device_ids)) - .filter(Device.owner_id == g.user.id) - .distinct() - .all() - ) - - # print only tags that are DHID - dhids = [x.devicehub_id for x in self._devices] - self._tags = ( - Tag.query.filter(Tag.owner_id == g.user.id).filter(Tag.id.in_(dhids)).all() - ) - - return is_valid diff --git a/ereuse_devicehub/inventory/views.py b/ereuse_devicehub/inventory/views.py index a438bf96..f8df5b0a 100644 --- a/ereuse_devicehub/inventory/views.py +++ b/ereuse_devicehub/inventory/views.py @@ -7,7 +7,6 @@ import flask_weasyprint from flask import Blueprint, g, make_response, request, url_for from flask.views import View from flask_login import current_user, login_required -from requests.exceptions import ConnectionError from sqlalchemy import or_ from werkzeug.exceptions import NotFound @@ -21,14 +20,12 @@ from ereuse_devicehub.inventory.forms import ( LotForm, NewActionForm, NewDeviceForm, - PrintTagsForm, TagDeviceForm, - TagForm, - TagUnnamedForm, TradeDocumentForm, TradeForm, UploadSnapshotForm, ) +from ereuse_devicehub.label.forms import PrintLabelsForm from ereuse_devicehub.resources.action.models import Trade from ereuse_devicehub.resources.device.models import Computer, DataStorage, Device from ereuse_devicehub.resources.documents.device_row import ActionRow, DeviceRow @@ -119,7 +116,7 @@ class DeviceListMix(GenericMixView): 'form_new_datawipe': form_new_datawipe, 'form_new_trade': form_new_trade, 'form_filter': form_filter, - 'form_print_tags': PrintTagsForm(), + 'form_print_labels': PrintLabelsForm(), 'lot': lot, 'tags': tags, 'list_devices': list_devices, @@ -317,120 +314,6 @@ class DeviceCreateView(GenericMixView): return flask.render_template(self.template_name, **context) -class TagListView(View): - methods = ['GET'] - decorators = [login_required] - template_name = 'inventory/tag_list.html' - - def dispatch_request(self): - lots = Lot.query.filter(Lot.owner_id == current_user.id) - tags = Tag.query.filter(Tag.owner_id == current_user.id).order_by(Tag.id) - context = { - 'lots': lots, - 'tags': tags, - 'page_title': 'Tags Management', - 'version': __version__, - } - return flask.render_template(self.template_name, **context) - - -class TagAddView(View): - methods = ['GET', 'POST'] - decorators = [login_required] - template_name = 'inventory/tag_create.html' - - def dispatch_request(self): - lots = Lot.query.filter(Lot.owner_id == current_user.id) - context = {'page_title': 'New Tag', 'lots': lots, 'version': __version__} - form = TagForm() - if form.validate_on_submit(): - form.save() - next_url = url_for('inventory.taglist') - return flask.redirect(next_url) - - return flask.render_template(self.template_name, form=form, **context) - - -class TagAddUnnamedView(View): - methods = ['GET', 'POST'] - decorators = [login_required] - template_name = 'inventory/tag_create_unnamed.html' - - def dispatch_request(self): - lots = Lot.query.filter(Lot.owner_id == current_user.id) - context = { - 'page_title': 'New Unnamed Tag', - 'lots': lots, - 'version': __version__, - } - form = TagUnnamedForm() - if form.validate_on_submit(): - try: - form.save() - except ConnectionError as e: - logger.error( - "Error while trying to connect to tag server: {}".format(e) - ) - msg = ( - "Sorry, we cannot create the unnamed tags requested because " - "some error happens while connecting to the tag server!" - ) - messages.error(msg) - - next_url = url_for('inventory.taglist') - return flask.redirect(next_url) - - return flask.render_template(self.template_name, form=form, **context) - - -class PrintTagsView(View): - """This View is used to print labels from multiple devices""" - - methods = ['POST', 'GET'] - decorators = [login_required] - template_name = 'inventory/print_tags.html' - title = 'Design and implementation of labels' - - def dispatch_request(self): - lots = Lot.query.filter(Lot.owner_id == current_user.id) - context = { - 'lots': lots, - 'page_title': self.title, - 'version': __version__, - 'referrer': request.referrer, - } - - form = PrintTagsForm() - if form.validate_on_submit(): - context['form'] = form - context['tags'] = form._tags - return flask.render_template(self.template_name, **context) - else: - messages.error('Error you need select one or more devices') - - next_url = request.referrer or url_for('inventory.devicelist') - return flask.redirect(next_url) - - -class TagDetailView(View): - decorators = [login_required] - template_name = 'inventory/tag_detail.html' - - def dispatch_request(self, id): - lots = Lot.query.filter(Lot.owner_id == current_user.id) - tag = ( - Tag.query.filter(Tag.owner_id == current_user.id).filter(Tag.id == id).one() - ) - - context = { - 'lots': lots, - 'tag': tag, - 'page_title': '{} Tag'.format(tag.code), - 'version': __version__, - } - return flask.render_template(self.template_name, **context) - - class TagLinkDeviceView(View): methods = ['POST'] decorators = [login_required] @@ -747,14 +630,6 @@ devices.add_url_rule( '/lot//device/add/', view_func=DeviceCreateView.as_view('lot_device_add'), ) -devices.add_url_rule('/tag/', view_func=TagListView.as_view('taglist')) -devices.add_url_rule('/tag/add/', view_func=TagAddView.as_view('tag_add')) -devices.add_url_rule( - '/tag/unnamed/add/', view_func=TagAddUnnamedView.as_view('tag_unnamed_add') -) -devices.add_url_rule( - '/tag//', view_func=TagDetailView.as_view('tag_details') -) devices.add_url_rule( '/tag/devices/add/', view_func=TagLinkDeviceView.as_view('tag_devices_add') ) @@ -765,7 +640,3 @@ devices.add_url_rule( devices.add_url_rule( '/export//', view_func=ExportsView.as_view('export') ) -devices.add_url_rule( - '/tags/print', - view_func=PrintTagsView.as_view('print_tags'), -) diff --git a/ereuse_devicehub/label/__init__.py b/ereuse_devicehub/label/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ereuse_devicehub/label/views.py b/ereuse_devicehub/label/views.py new file mode 100644 index 00000000..e00a3d41 --- /dev/null +++ b/ereuse_devicehub/label/views.py @@ -0,0 +1,142 @@ +import logging + +import flask +from flask import Blueprint, request, url_for +from flask.views import View +from flask_login import current_user, login_required +from requests.exceptions import ConnectionError + +from ereuse_devicehub import __version__, messages +from ereuse_devicehub.label.forms import PrintLabelsForm, TagForm, TagUnnamedForm +from ereuse_devicehub.resources.lot.models import Lot +from ereuse_devicehub.resources.tag.model import Tag + +label = Blueprint('label', __name__, url_prefix='/label') + +logger = logging.getLogger(__name__) + + +class TagListView(View): + methods = ['GET'] + decorators = [login_required] + template_name = 'label/label_list.html' + + def dispatch_request(self): + lots = Lot.query.filter(Lot.owner_id == current_user.id) + tags = Tag.query.filter(Tag.owner_id == current_user.id).order_by(Tag.id) + context = { + 'lots': lots, + 'tags': tags, + 'page_title': 'Tags Management', + 'version': __version__, + } + return flask.render_template(self.template_name, **context) + + +class TagAddView(View): + methods = ['GET', 'POST'] + decorators = [login_required] + template_name = 'label/tag_create.html' + + def dispatch_request(self): + lots = Lot.query.filter(Lot.owner_id == current_user.id) + context = {'page_title': 'New Tag', 'lots': lots, 'version': __version__} + form = TagForm() + if form.validate_on_submit(): + form.save() + next_url = url_for('label.label_list') + return flask.redirect(next_url) + + return flask.render_template(self.template_name, form=form, **context) + + +class TagAddUnnamedView(View): + methods = ['GET', 'POST'] + decorators = [login_required] + template_name = 'label/tag_create_unnamed.html' + + def dispatch_request(self): + lots = Lot.query.filter(Lot.owner_id == current_user.id) + context = { + 'page_title': 'New Unnamed Tag', + 'lots': lots, + 'version': __version__, + } + form = TagUnnamedForm() + if form.validate_on_submit(): + try: + form.save() + except ConnectionError as e: + logger.error( + "Error while trying to connect to tag server: {}".format(e) + ) + msg = ( + "Sorry, we cannot create the unnamed tags requested because " + "some error happens while connecting to the tag server!" + ) + messages.error(msg) + + next_url = url_for('label.label_list') + return flask.redirect(next_url) + + return flask.render_template(self.template_name, form=form, **context) + + +class PrintLabelsView(View): + """This View is used to print labels from multiple devices""" + + methods = ['POST', 'GET'] + decorators = [login_required] + template_name = 'label/print_labels.html' + title = 'Design and implementation of labels' + + def dispatch_request(self): + lots = Lot.query.filter(Lot.owner_id == current_user.id) + context = { + 'lots': lots, + 'page_title': self.title, + 'version': __version__, + 'referrer': request.referrer, + } + + form = PrintLabelsForm() + if form.validate_on_submit(): + context['form'] = form + context['tags'] = form._tags + return flask.render_template(self.template_name, **context) + else: + messages.error('Error you need select one or more devices') + + next_url = request.referrer or url_for('inventory.devicelist') + return flask.redirect(next_url) + + +class LabelDetailView(View): + decorators = [login_required] + template_name = 'label/label_detail.html' + + def dispatch_request(self, id): + lots = Lot.query.filter(Lot.owner_id == current_user.id) + tag = ( + Tag.query.filter(Tag.owner_id == current_user.id).filter(Tag.id == id).one() + ) + + context = { + 'lots': lots, + 'tag': tag, + 'page_title': '{} Tag'.format(tag.code), + 'version': __version__, + } + return flask.render_template(self.template_name, **context) + + +label.add_url_rule('/', view_func=TagListView.as_view('label_list')) +label.add_url_rule('/add/', view_func=TagAddView.as_view('tag_add')) +label.add_url_rule( + '/unnamed/add/', view_func=TagAddUnnamedView.as_view('tag_unnamed_add') +) +label.add_url_rule( + '/print', + view_func=PrintLabelsView.as_view('print_labels'), +) +label.add_url_rule('//', view_func=LabelDetailView.as_view('label_details')) diff --git a/ereuse_devicehub/templates/ereuse_devicehub/base_site.html b/ereuse_devicehub/templates/ereuse_devicehub/base_site.html index 5d87be53..9592978a 100644 --- a/ereuse_devicehub/templates/ereuse_devicehub/base_site.html +++ b/ereuse_devicehub/templates/ereuse_devicehub/base_site.html @@ -181,7 +181,7 @@
  • - diff --git a/ereuse_devicehub/templates/inventory/tag_create_unnamed.html b/ereuse_devicehub/templates/label/tag_create_unnamed.html similarity index 90% rename from ereuse_devicehub/templates/inventory/tag_create_unnamed.html rename to ereuse_devicehub/templates/label/tag_create_unnamed.html index d8eddde0..3e668312 100644 --- a/ereuse_devicehub/templates/inventory/tag_create_unnamed.html +++ b/ereuse_devicehub/templates/label/tag_create_unnamed.html @@ -5,7 +5,7 @@

    {{ title }}

    @@ -49,7 +49,7 @@
    - Cancel + Cancel