diff --git a/.github/workflows/flask.yml b/.github/workflows/flask.yml index 328533a8..16086b5b 100644 --- a/.github/workflows/flask.yml +++ b/.github/workflows/flask.yml @@ -45,7 +45,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -qy - sudo apt-get -y install postgresql-client + sudo apt-get -y install postgresql-client --no-install-recommends python -m pip install --upgrade pip pip install flake8 pytest coverage pip install -r requirements.txt @@ -76,8 +76,7 @@ jobs: - name: Run Tests run: | export SECRET_KEY=`python3 -c 'import secrets; print(secrets.token_hex())'` - source env/bin/activate - coverage run --source='ereuse_devicehub' env/bin/pytest -m mvp --maxfail=5 tests/ + coverage run --source='ereuse_devicehub' -m pytest -m mvp --maxfail=5 tests/ coverage report --include='ereuse_devicehub/*' coverage xml diff --git a/ereuse_devicehub/inventory/forms.py b/ereuse_devicehub/inventory/forms.py index 1032b3e7..d028495e 100644 --- a/ereuse_devicehub/inventory/forms.py +++ b/ereuse_devicehub/inventory/forms.py @@ -32,6 +32,8 @@ from ereuse_devicehub.resources.tag.model import Tag from ereuse_devicehub.resources.tradedocument.models import TradeDocument from ereuse_devicehub.resources.user.exceptions import InsufficientPermission from ereuse_devicehub.resources.user.models import User +from ereuse_devicehub.resources.action.models import Trade +from sqlalchemy import or_ class LotDeviceForm(FlaskForm): @@ -45,9 +47,11 @@ class LotDeviceForm(FlaskForm): return False self._lot = ( - Lot.query.filter(Lot.id == self.lot.data) - .filter(Lot.owner_id == g.user.id) - .one() + Lot.query.outerjoin(Trade) + .filter(Lot.id == self.lot.data) + .filter(or_(Trade.user_from == g.user, + Trade.user_to == g.user, + Lot.owner_id == g.user.id)).one() ) devices = set(self.devices.data.split(",")) @@ -67,14 +71,16 @@ class LotDeviceForm(FlaskForm): if trade not in dev.actions: trade.devices.add(dev) - self._lot.devices.update(self._devices) - db.session.add(self._lot) - db.session.commit() + if self._devices: + self._lot.devices.update(self._devices) + db.session.add(self._lot) + db.session.commit() def remove(self): - self._lot.devices.difference_update(self._devices) - db.session.add(self._lot) - db.session.commit() + if self._devices: + self._lot.devices.difference_update(self._devices) + db.session.add(self._lot) + db.session.commit() class LotForm(FlaskForm): @@ -723,9 +729,11 @@ class TradeForm(NewActionForm): self.user_from.render_kw['data-email'] = g.user.email self.user_to.render_kw['data-email'] = g.user.email self._lot = ( - Lot.query.filter(Lot.id == self.lot.data) - .filter(Lot.owner_id == g.user.id) - .one() + Lot.query.outerjoin(Trade) + .filter(Lot.id == self.lot.data) + .filter(or_(Trade.user_from == g.user, + Trade.user_to == g.user, + Lot.owner_id == g.user.id)).one() ) def validate(self, extra_validators=None): @@ -816,7 +824,6 @@ class TradeForm(NewActionForm): self.user_from = g.user self.user_to = self.get_or_create_user(code) - return # Create supplier (from) phantom account if not user_from and user_to: @@ -825,6 +832,9 @@ class TradeForm(NewActionForm): self.user_from = self.get_or_create_user(code) self.user_to = g.user + self.db_user_to = self.user_to + self.db_user_from = self.user_from + def get_or_create_user(self, code): email = "{}_{}@dhub.com".format(str(g.user.id), code) user = User.query.filter_by(email=email).first() diff --git a/ereuse_devicehub/inventory/views.py b/ereuse_devicehub/inventory/views.py index 8bb9633b..2b5c6161 100644 --- a/ereuse_devicehub/inventory/views.py +++ b/ereuse_devicehub/inventory/views.py @@ -7,6 +7,7 @@ from flask import Blueprint, g, make_response, request, url_for from flask.views import View from flask_login import current_user, login_required from werkzeug.exceptions import NotFound +from sqlalchemy import or_ from ereuse_devicehub import messages from ereuse_devicehub.inventory.forms import ( @@ -42,7 +43,10 @@ class DeviceListMix(View): # TODO @cayop adding filter # https://github.com/eReuse/devicehub-teal/blob/testing/ereuse_devicehub/resources/device/views.py#L56 filter_types = ['Desktop', 'Laptop', 'Server'] - lots = Lot.query.filter(Lot.owner_id == current_user.id) + lots = Lot.query.outerjoin(Trade) \ + .filter(or_(Trade.user_from == g.user, + Trade.user_to == g.user, + Lot.owner_id == g.user.id)).distinct() lot = None tags = ( Tag.query.filter(Tag.owner_id == current_user.id) @@ -51,6 +55,7 @@ class DeviceListMix(View): ) if lot_id: + # import pdb; pdb.set_trace() lot = lots.filter(Lot.id == lot_id).one() devices = [dev for dev in lot.devices if dev.type in filter_types] devices = sorted(devices, key=lambda x: x.updated, reverse=True) @@ -130,9 +135,14 @@ class LotDeviceAddView(View): form = LotDeviceForm() if form.validate_on_submit(): form.save() + messages.success( + 'Add devices to lot "{}" successfully!'.format(form._lot.name) + ) + else: + messages.error('Error adding devices to lot!') - next_url = request.referrer or url_for('inventory.devices.devicelist') - return flask.redirect(next_url) + next_url = request.referrer or url_for('inventory.devices.devicelist') + return flask.redirect(next_url) class LotDeviceDeleteView(View): @@ -144,9 +154,14 @@ class LotDeviceDeleteView(View): form = LotDeviceForm() if form.validate_on_submit(): form.remove() + messages.success( + 'Remove devices from lot "{}" successfully!'.format(form._lot.name) + ) + else: + messages.error('Error removing devices from lot!') - next_url = request.referrer or url_for('inventory.devices.devicelist') - return flask.redirect(next_url) + next_url = request.referrer or url_for('inventory.devices.devicelist') + return flask.redirect(next_url) class LotCreateView(View):