def create_post(): if not current_user.is_authenticated: return redirect(url_for("register")) category_id = request.args.get("category_id", None, type=int) form = PostForm() categories = Category.query.order_by("title") form.category_id.choices = [(c.id, c.title) for c in categories] form.category_id.data = (category_id if category_id else categories.first().id) if form.validate_on_submit(): post = Post( title=form.title.data, body=form.body.data, link=form.link.data, url=form.url.data, category_id=form.category_id.data, author=current_user, ) db.session.add(post) db.session.commit() ActivityLog.log_event(current_user, f"Create: {post}") # removed .id flash("Your post is now live!") return redirect(url_for("index")) return render_template( "create_post.html", greeting_name=greeting_name(), title="Create Post", form=form, )
def down_vote_comment(comment_id): next_page = request.args.get("next") if current_user.is_authenticated: comment = Comment.query.filter_by(id=comment_id).first_or_404() comment.down_vote(current_user) ActivityLog.log_event(current_user, f"Down Vote: {comment}") return redirect(next_page or url_for("index")) else: return redirect(url_for("login"))
def up_vote(id): next = request.args.get("next") if current_user.is_authenticated: post = Post.query.filter_by(id=id).first_or_404() post.up_vote(current_user) ActivityLog.log_event(current_user, f"Up Vote: {post}") # removed .id return redirect(next or url_for("index")) else: return redirect(url_for("login"))
def up_vote_comment(id): next = request.args.get("next") if current_user.is_authenticated: comment = Comment.query.filter_by(id=id).first_or_404() comment.up_vote(current_user) ActivityLog.log_event(current_user, f"Up Vote: {comment}") return redirect(next or url_for("index")) # ^^^ removed .id else: return redirect(url_for("login"))
def test_activity_logging(self): s = Student(first_name='billy') act1 = Activity(activity_name='nap') act_entry1 = ActivityLog(student_id=s.student_id, activity_id=act1.activity_id) s.activity.append(act_entry1) act1.student.append(act_entry1) act_entry2 = ActivityLog(student_id=s.student_id, activity_id=act1.activity_id) s.activity.append(act_entry2) act1.student.append(act_entry2) self.assertTrue(len(s.activity) == 2)
def test_login_and_logout_create_activity_log(client, test_user): login(client, test_user.username, PASSWORD) e = ActivityLog.latest_entry() assert e is not None assert "Login" in e.details assert test_user.id == e.user_id logout(client) e = ActivityLog.latest_entry() assert e is not None assert "Logout" in e.details assert test_user.id == e.user_id
def add_activity_log(activity, description, employee_id): activity_log = ActivityLog() activity_log.activity = activity activity_log.description = description activity_log.employee_id = employee_id db.session.add(activity_log) db.session.commit() return activity_log
def counter_contract(contract_id): contract = Contract.query.filter(Contract.id == contract_id).first_or_404() parent = contract if contract.parent_id is None else Contract.query.get(contract.parent_id) role = 'owner' if contract.owner_id == current_user.id else 'cparty' if 'counter' not in contract_transitions[contract.status][role]: flash('This action is not permitted') return redirect(url_for('index')) form = EditProposalForm() form.template_id.choices = [(t.id, t.title) for t in Template.query.order_by('title')] if form.validate_on_submit(): proposal = Contract(template_id=form.template_id.data, params=form.params.data, memo=form.memo.data, status="draft", owner_id=current_user.id, parent_id=parent.id) db.session.add(proposal) db.session.flush() for p in contract.party: party = Party(contract_id=proposal.id, role=p.role, user_id=p.user_id) db.session.add(party) db.session.flush() description = 'Created a counter draft' alog = ActivityLog(contract_id=proposal.id, timestamp=datetime.now(), method='/contract/counter', description=description, user_id=current_user.id) db.session.add(alog) db.session.commit() flash('Draft edited.') return redirect(url_for('index')) form.template_id.data = contract.template_id form.params.data = contract.params return render_template('edit_draft.html', title='Edit a Draft Proposal', form=form, contract_id=contract_id, parties=contract.party, deal=parent.memo)
def register(): if current_user.is_authenticated: return redirect(url_for("index")) form = RegistrationForm() if form.validate_on_submit(): user = User(username=form.username.data, email=form.email.data) user.set_password(form.password.data) db.session.add(user) db.session.commit() ActivityLog.log_event(user, "Register") # removed .id flash("Congratulations, you are now a registered user!") return redirect(url_for("login")) return render_template("register.html", greeting_name=greeting_name(), title="Register", form=form)
def test_activity_log_logs_to_info_when_successful_response(mocker): mocker.patch('logging.info') response = requests.Response() response.status_code = 201 u = User(username="******", email="*****@*****.**") act = { "user_id": u.id, "username": u.username, "timestamp": str(datetime.utcnow()), "details": "testing success" } mocker.patch.object(requests, 'post', return_value=response) ActivityLog.post_activity(act) requests.post.assert_called_once() logging.info.asset_called_once_with(f"Post activity SUCCESS at ")
def test_activity_log_logs_to_critical_when_failed_response(mocker): mocker.patch('logging.critical') response = requests.Response() response.status_code = 404 u = User(username="******", email="*****@*****.**") act = { "user_id": u.id, "username": u.username, "timestamp": str(datetime.utcnow()), "details": "testing fail" } mocker.patch.object(requests, 'post', return_value=response) ActivityLog.post_activity(act) requests.post.assert_called_once() logging.critical.asset_called_once_with(f"Post activity FAILURE: ")
def login(): if current_user.is_authenticated: return redirect(url_for("index")) form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.username.data).first() if user is None or not user.check_password(form.password.data): flash("Invalid username or password") return redirect(url_for("login")) login_user(user, remember=form.remember_me.data) ActivityLog.log_event(user, f"Login {user}") # removed .id return redirect(url_for("index")) elif form.is_submitted(): return redirect(url_for("login")) else: return render_template("login.html", greeting_name=greeting_name(), title="Login", form=form)
def sign_contract(contract_id): contract = Contract.query.filter(Contract.id == contract_id).first_or_404() role = 'owner' if contract.owner_id == current_user.id else 'cparty' if 'sign' not in contract_transitions[contract.status][role]: flash('This action is not permitted') return redirect(url_for('index')) all_signed = True for party in contract.party: if party.user_id == current_user.id: if party.signed_on is None: party.signed_on = datetime.now() else: flash('Contract is already signed by this party') else: if party.signed_on is None: all_signed = False if all_signed: contract.status = "signed" siblings = Contract.query.filter(or_(Contract.parent_id == contract.parent_id, Contract.id == contract.parent_id)).all() for c in siblings: if c.id == contract.id: continue c.status = "archived" db.session.flush() description = 'Signed a proposal' alog = ActivityLog(contract_id=contract.id, timestamp=datetime.now(), method='/contract/sign', description=description, user_id=current_user.id) db.session.add(alog) description = 'Contract is in effect' alog2 = ActivityLog(contract_id=contract.id, timestamp=datetime.now(), method='/contract/sign', description=description, user_id=current_user.id) db.session.add(alog2) db.session.commit() flash('Contract signed--now in effect!') else: contract.status = "partially signed" db.session.flush() description = 'Signed a proposal' alog = ActivityLog(contract_id=contract.id, timestamp=datetime.now(), method='/contract/sign', description=description, user_id=current_user.id) db.session.add(alog) db.session.commit() flash('Contract signed--now pending other signature(s)') msg = Message(subject='Someone signed a contract', sender='*****@*****.**', recipients=[p.user.email for p in contract.party if p.user_id != current_user.id], html='<h1>New Signature</h1><p>Please click <a href="' + url_for('show_draft', contract_id=contract_id, _external=True) + '">here</a> to view the contract.</p>') mail.send(msg) return redirect(url_for('index'))
def test_activity_log_logs_to_critical_when_exception_occurs(mocker): URL = os.environ.get('ACTLOG_URL') mocker.patch('logging.critical') response = requests.Response() response.status_code = 404 u = User(username="******", email="*****@*****.**") act = { "user_id": u.id, "username": u.username, "timestamp": str(datetime.utcnow()), "details": "testing success" } mocker.patch.object(requests, 'post', side_effect=requests.exceptions.RequestException) ActivityLog.post_activity(act) requests.post.assert_called_once() logging.critical.asset_called_once_with( f"Could not connect to activity log service at {URL}")
def archive_draft(contract_id): contract = Contract.query.filter(Contract.id == contract_id).first_or_404() role = 'owner' if contract.owner_id == current_user.id else 'cparty' if 'archive' not in contract_transitions[contract.status][role]: flash('This action is not permitted') return redirect(url_for('index')) contract.status = "archived" db.session.flush() description = 'Archiving a draft/proposal' alog = ActivityLog(contract_id=contract.id, timestamp=datetime.now(), method='/contract/archive', description=description, user_id=current_user.id) db.session.add(alog) db.session.commit() return redirect(url_for('index'))
def withdraw(contract_id): contract = Contract.query.filter(Contract.id == contract_id).first_or_404() role = 'owner' if contract.owner_id == current_user.id else 'cparty' if 'withdraw' not in contract_transitions[contract.status][role]: flash('This action is not permitted') return redirect(url_for('index')) contract.status = "draft" db.session.flush() description = 'Withdraw a proposal' alog = ActivityLog(contract_id=contract.id, timestamp=datetime.now(), method='/contract/withdraw', description=description, user_id=current_user.id) db.session.add(alog) db.session.commit() msg = Message(subject='A proposal of yours has been withdrawn', sender='*****@*****.**', recipients=[p.user.email for p in contract.party if p.user_id != current_user.id], html='<h1>Proposal Withdrawn</h1><p>Please click <a href="' + url_for('show_draft', contract_id=contract_id, _external=True) + '">here</a> to view the proposal.</p>') mail.send(msg) return redirect(url_for('index'))
def test_new_post_should_create_activity_log(client, test_user, default_category): login(client, test_user.username, PASSWORD) title = "Logged post title" response = client.post(url_for("create_post"), data=dict(title=title, body='', category_id=default_category.id, user_id=test_user.id), follow_redirects=True) assert response.status_code == 200 e = ActivityLog.latest_entry() assert e is not None assert title in e.details assert test_user.id == e.user_id
def create_draft(): form = CreateProposalForm() form.template_id.choices = [(t.id, t.title) for t in Template.query.order_by('title')] if form.validate_on_submit(): proposal = Contract(template_id=form.template_id.data, memo=form.memo.data, params=form.params.data, status="draft", owner_id=current_user.id) db.session.add(proposal) db.session.flush() for p in json.loads(form.parties.data): party = Party(contract_id=proposal.id, role=p['label'], user_id=p['user_id']) db.session.add(party) db.session.flush() description = 'Creation of a new draft' alog = ActivityLog(contract_id=proposal.id, timestamp=datetime.now(), method='/contract/new', description=description, user_id=current_user.id) db.session.add(alog) db.session.commit() flash('Draft saved.') return redirect(url_for('index')) contacts = User.query.all() return render_template('create_draft.html', title='Create a new Draft Proposal', form=form, contacts=contacts)
def test_repr_function_for_activity(client, test_user, single_post): a = ActivityLog() a.details = "You added Fernando" a.id = 1 assert a.__repr__() == "<ActivityLog id 1 - You added Fernando>"
def logout(): ActivityLog.log_event(current_user, f"Logout {current_user}") # removed .id logout_user() return redirect(url_for("index"))
def test_activitylog_as_string(): details = "First Activity log" new_activitylog = ActivityLog(details=details) assert details in str(new_activitylog)