Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fixes #4708: Rating field of feedback should be float (#4728)
Remove unused import

USING rating::double precision

Add rating rounding and limits

Use modern raise syntax

Add marshmallow validation

Resolve merge conflicts

Fix typo

Add dict in error response

Use validate.Range class

Cast existing data

Use PL/PGSQL for rating update

Remove function after update
  • Loading branch information
schedutron authored and bhaveshAn committed May 28, 2018
1 parent e840409 commit a84e05e
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 5 deletions.
5 changes: 4 additions & 1 deletion app/api/schema/feedbacks.py
@@ -1,3 +1,6 @@
"""Schema class for Feedbacks"""

from marshmallow.validate import Range
from marshmallow_jsonapi import fields
from marshmallow_jsonapi.flask import Schema, Relationship

Expand All @@ -18,7 +21,7 @@ class Meta:
inflect = dasherize

id = fields.Str(dump_only=True)
rating = fields.Str(required=True)
rating = fields.Float(required=True, validate=Range(min=0, max=5))
comment = fields.Str(required=False)
event = Relationship(attribute='event',
self_view='v1.feedback_event',
Expand Down
6 changes: 4 additions & 2 deletions app/models/feedback.py
Expand Up @@ -5,15 +5,17 @@ class Feedback(db.Model):
"""Feedback model class"""
__tablename__ = 'feedback'
id = db.Column(db.Integer, primary_key=True)
rating = db.Column(db.String, nullable=False)
rating = db.Column(db.Float, nullable=False)
comment = db.Column(db.String, nullable=True)
user_id = db.Column(db.Integer,
db.ForeignKey('users.id', ondelete='CASCADE'))
event_id = db.Column(db.Integer,
db.ForeignKey('events.id', ondelete='CASCADE'))

def __init__(self, rating=None, comment=None, event_id=None, user_id=None):
self.rating = rating
rating = float(rating)
self.rating = round(rating*2, 0) / 2 # Rounds to nearest 0.5

self.comment = comment
self.event_id = event_id
self.user_id = user_id
Expand Down
4 changes: 2 additions & 2 deletions docs/api/api_blueprint.apib
Expand Up @@ -201,7 +201,7 @@ Create a new user using an email, password and an optional name.
{
"attributes":
{
"email": "example@example.com",
"email": "email@example.com",
"password": "password",
"avatar_url": "http://example.com/example.png",
"first-name": "John",
Expand Down Expand Up @@ -18923,7 +18923,7 @@ feedbacks related to the events.

| Parameter | Description | Type | Required |
|:----------|-------------|------|----------|
| `rating` | Rating for the overall event | string | **yes** |
| `rating` | Rating for the overall event | float | **yes** |
| `comment` | Comments and suggestions about the event | string | - |


Expand Down
62 changes: 62 additions & 0 deletions migrations/versions/194a5a2a44ef_.py
@@ -0,0 +1,62 @@
"""empty message
Revision ID: 194a5a2a44ef
Revises: caf96244e10b
Create Date: 2018-05-21 01:54:54.296053
"""

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '194a5a2a44ef'
down_revision = 'caf96244e10b'

class ReplaceableObject(object):
def __init__(self, name, sqltext):
self.name = name
self.sqltext = sqltext

update_rating_func = ReplaceableObject(
"update_rating(rating text)",
"""
RETURNS text AS $$
DECLARE
r NUMERIC;
BEGIN
r = cast(rating as NUMERIC);
IF r < 0 OR r > 5 THEN
RETURN '0';
END IF;
r = round(r*2) / 2;
RETURN cast(r as VARCHAR);
EXCEPTION WHEN invalid_text_representation THEN
RETURN '0';
END;
$$
STRICT
LANGUAGE plpgsql IMMUTABLE;
""")


def upgrade():
op.create_or_replace_sp(update_rating_func)
op.execute("UPDATE feedback SET rating=update_rating(rating)")
op.execute("DROP FUNCTION update_rating(text)")

op.alter_column('feedback', 'rating',
existing_type=sa.VARCHAR(),
type_=sa.Float(),
existing_nullable=False,
postgresql_using='rating::double precision')


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('feedback', 'rating',
existing_type=sa.Float(),
type_=sa.VARCHAR(),
existing_nullable=False)
# ### end Alembic commands ###

0 comments on commit a84e05e

Please sign in to comment.