From 625eb8510f93b115c0f1e817e520057d61d58850 Mon Sep 17 00:00:00 2001 From: Adam Levin Date: Sat, 11 May 2019 12:43:04 -0400 Subject: [PATCH 1/6] Use Docker to seed db (#253) * added to .gitignore * added a file testdb_seed * removed reseting db from docker_script because this is handled in docker-compose-dev NOTE: docker-compose.yml is not currently used and will not reset or seed the database. Just use docker-compose-dev.yml for now. --- .gitignore | 2 + backend/docker_script.sh | 1 - docker-compose-dev.yml | 3 +- testdb_seed | 665 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 669 insertions(+), 2 deletions(-) create mode 100644 testdb_seed diff --git a/.gitignore b/.gitignore index e43b0f9..f4eecac 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .DS_Store +*/.python-version +api.log diff --git a/backend/docker_script.sh b/backend/docker_script.sh index 2c2bc9a..07ed0e9 100755 --- a/backend/docker_script.sh +++ b/backend/docker_script.sh @@ -1,3 +1,2 @@ #! /bin/bash -python manage.py recreate_db python manage.py runserver diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index e862abf..cb02377 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -10,8 +10,9 @@ services: - POSTGRES_DB=${POSTGRES_DB} volumes: - flask-app-db:/var/lib/postgresql/data + - ./testdb_seed:/docker-entrypoint-initdb.d/testdb_seed.sql ports: - - 5432:5432 + - 5431:5432 client: build: dockerfile: Dockerfile.dev diff --git a/testdb_seed b/testdb_seed new file mode 100644 index 0000000..412250c --- /dev/null +++ b/testdb_seed @@ -0,0 +1,665 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 10.7 (Debian 10.7-1.pgdg90+1) +-- Dumped by pg_dump version 10.7 (Debian 10.7-1.pgdg90+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: +-- + +CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; + + +-- +-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: +-- + +COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; + + +SET default_tablespace = ''; + +SET default_with_oids = false; + +-- +-- Name: book; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public.book ( + id integer NOT NULL, + name character varying NOT NULL, + author character varying NOT NULL, + grade character varying NOT NULL, + year integer NOT NULL, + cover_url character varying, + published boolean NOT NULL +); + + +ALTER TABLE public.book OWNER TO testusr; + +-- +-- Name: book_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public.book_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.book_id_seq OWNER TO testusr; + +-- +-- Name: book_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public.book_id_seq OWNED BY public.book.id; + + +-- +-- Name: parent_advice; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public.parent_advice ( + id integer NOT NULL, + text character varying NOT NULL +); + + +ALTER TABLE public.parent_advice OWNER TO testusr; + +-- +-- Name: parent_advice_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public.parent_advice_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.parent_advice_id_seq OWNER TO testusr; + +-- +-- Name: parent_advice_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public.parent_advice_id_seq OWNED BY public.parent_advice.id; + + +-- +-- Name: question; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public.question ( + id integer NOT NULL, + text character varying NOT NULL, + options character varying[], + correct_option character varying, + quiz_id integer NOT NULL +); + + +ALTER TABLE public.question OWNER TO testusr; + +-- +-- Name: questionResult; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public."questionResult" ( + id integer NOT NULL, + user_answer character varying NOT NULL, + correct_answer character varying NOT NULL, + correct boolean NOT NULL, + quiz_num integer, + question_id integer, + quiz_result_id integer, + question_num integer +); + + +ALTER TABLE public."questionResult" OWNER TO testusr; + +-- +-- Name: questionResult_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public."questionResult_id_seq" + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public."questionResult_id_seq" OWNER TO testusr; + +-- +-- Name: questionResult_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public."questionResult_id_seq" OWNED BY public."questionResult".id; + + +-- +-- Name: question_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public.question_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.question_id_seq OWNER TO testusr; + +-- +-- Name: question_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public.question_id_seq OWNED BY public.question.id; + + +-- +-- Name: quiz; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public.quiz ( + id integer NOT NULL, + name character varying NOT NULL, + book_id integer, + published boolean NOT NULL +); + + +ALTER TABLE public.quiz OWNER TO testusr; + +-- +-- Name: quizResult; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public."quizResult" ( + id integer NOT NULL, + num_correct integer, + num_total integer, + date_taken timestamp without time zone NOT NULL, + user_id integer, + quiz_id integer +); + + +ALTER TABLE public."quizResult" OWNER TO testusr; + +-- +-- Name: quizResult_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public."quizResult_id_seq" + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public."quizResult_id_seq" OWNER TO testusr; + +-- +-- Name: quizResult_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public."quizResult_id_seq" OWNED BY public."quizResult".id; + + +-- +-- Name: quiz_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public.quiz_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.quiz_id_seq OWNER TO testusr; + +-- +-- Name: quiz_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public.quiz_id_seq OWNED BY public.quiz.id; + + +-- +-- Name: user; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public."user" ( + id integer NOT NULL, + name character varying NOT NULL, + password character varying NOT NULL, + username character varying NOT NULL, + options integer[], + is_admin boolean NOT NULL +); + + +ALTER TABLE public."user" OWNER TO testusr; + +-- +-- Name: user_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public.user_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.user_id_seq OWNER TO testusr; + +-- +-- Name: user_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public.user_id_seq OWNED BY public."user".id; + + +-- +-- Name: year; Type: TABLE; Schema: public; Owner: testusr +-- + +CREATE TABLE public.year ( + id integer NOT NULL, + year integer NOT NULL +); + + +ALTER TABLE public.year OWNER TO testusr; + +-- +-- Name: year_id_seq; Type: SEQUENCE; Schema: public; Owner: testusr +-- + +CREATE SEQUENCE public.year_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.year_id_seq OWNER TO testusr; + +-- +-- Name: year_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: testusr +-- + +ALTER SEQUENCE public.year_id_seq OWNED BY public.year.id; + + +-- +-- Name: book id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.book ALTER COLUMN id SET DEFAULT nextval('public.book_id_seq'::regclass); + + +-- +-- Name: parent_advice id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.parent_advice ALTER COLUMN id SET DEFAULT nextval('public.parent_advice_id_seq'::regclass); + + +-- +-- Name: question id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.question ALTER COLUMN id SET DEFAULT nextval('public.question_id_seq'::regclass); + + +-- +-- Name: questionResult id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."questionResult" ALTER COLUMN id SET DEFAULT nextval('public."questionResult_id_seq"'::regclass); + + +-- +-- Name: quiz id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.quiz ALTER COLUMN id SET DEFAULT nextval('public.quiz_id_seq'::regclass); + + +-- +-- Name: quizResult id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."quizResult" ALTER COLUMN id SET DEFAULT nextval('public."quizResult_id_seq"'::regclass); + + +-- +-- Name: user id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."user" ALTER COLUMN id SET DEFAULT nextval('public.user_id_seq'::regclass); + + +-- +-- Name: year id; Type: DEFAULT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.year ALTER COLUMN id SET DEFAULT nextval('public.year_id_seq'::regclass); + + +-- +-- Data for Name: book; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public.book (id, name, author, grade, year, cover_url, published) FROM stdin; +1 The Adventures of Huckleberry Finn Mark Twain Intermediate 2018 https://cdn3.volusion.com/jtoq7.b7owf/v/vspfiles/photos/ADVENTURES_OF_HUCKLEBERRY_FINN-2.jpg t +2 Wishtree Katherine Applegate Intermediate 2019 https://images-na.ssl-images-amazon.com/images/I/61al%2BP%2B9JDL._SX365_BO1,204,203,200_.jpg t +3 A Boy Called Bat Elana Arnold Intermediate 2019 https://images-na.ssl-images-amazon.com/images/I/51ZW6vJvuIL._SX349_BO1,204,203,200_.jpg t +4 Ruby on the Outside Nora Raleigh Baskin Intermediate 2019 t +5 Pashmina Nidhi Chanani Intermediate 2019 https://images-na.ssl-images-amazon.com/images/I/91qAL9ZLi9L.jpg t +6 The Losers' Club Andrew Clements Intermediate 2019 https://images-na.ssl-images-amazon.com/images/I/515gx6DaIfL._SX329_BO1,204,203,200_.jpg t +7 Serafina and the Black Cloak Robert Beatty Middle 2019 https://images-na.ssl-images-amazon.com/images/I/51eWzYTXg6L._SX339_BO1,204,203,200_.jpg t +8 The War I Finally Won Kimberly Brubaker Bradley Middle 2019 https://images-na.ssl-images-amazon.com/images/I/51pLVzrgzGL._SX329_BO1,204,203,200_.jpg t +9 Waiting for Normal Leslie Connor Middle 2019 t +10 The Only Road Alexandra Diaz Middle 2019 t +11 It Ain't So Awful, Falafel Firoozeh Dumas Middle 2019 https://images-na.ssl-images-amazon.com/images/I/51miMQ66exL._SX333_BO1,204,203,200_.jpg t +\. + + +-- +-- Data for Name: parent_advice; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public.parent_advice (id, text) FROM stdin; +1 \nBefore reading:\n
    \n
  1. Looking at the title, cover and illustrations/pictures, what do you think will happen in this book?
  2. \n
  3. What makes you think that?
  4. \n
  5. What characters do you think might be in the book?
  6. \n
  7. Do you think there will be problem in the story? Why?
  8. \n
  9. What do you already know about the topic of this book?
  10. \n
  11. Does the topic or story relate to you or your family? How?
  12. \n
  13. Do you think it will be like any other book you’ve read? If so, which one, and how do you think it will be similar?
  14. \n
\n +2 \nDuring reading:\n
    \n
  1. What has happened so far in the story? Can you tell me using sequence words? (first, then, next, after, finally, etc.)
  2. \n
  3. What do you predict will happen next?
  4. \n
  5. How do you think the story will end?
  6. \n
  7. Why do you think the character did ____________?
  8. \n
  9. What would you have done if you were the character?
  10. \n
  11. How would you have felt if you were the character?
  12. \n
  13. When you read, what pictures did you see in your head? How did you imagine it looked like?
  14. \n
  15. What are you wondering about as you read? What questions do you have?
  16. \n
  17. Think about the predictions you made before reading; do you still think the story will go that way? Why or why not? How do you think it will go now?
  18. \n
\n +3 \nAfter reading:\n
    \n
  1. Why is the title a good title for the book/story? If you had to give it a different title, what would be another good title for it?
  2. \n
  3. Were your predictions correct? Where did you have to fix your prediction as you read?
  4. \n
  5. If there was a problem, did it get solved? How did the character try to solve the problem?
  6. \n
  7. What happened because of the problem?
  8. \n
  9. Did any of the characters change through the story? Who changed, and how did they change?
  10. \n
  11. Why do you think the author wrote this?
  12. \n
  13. What is the most important point that the author is trying to make in his/her writing?
  14. \n
  15. What was your favorite part? Why?
  16. \n
  17. If you could change one part, what would you change?
  18. \n
  19. If you could ask the author a question, what would you ask?
  20. \n
  21. Can you retell the story in sequence order (use your fingers and sequence words: first, second, then, next, etc.)
  22. \n
  23. Is there a character in the story that reminds you of someone you know? If so, who are they like, and why do you think that?
  24. \n
  25. Does this book remind you of another book you know? Does it remind you of something you’ve experienced in real life?
  26. \n
\n +\. + + +-- +-- Data for Name: question; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public.question (id, text, options, correct_option, quiz_id) FROM stdin; +1 Who wrote Huckleberry Finn? {"Mark Twain","JK Rowling",Steinbeck,"Tony Morrison"} Mark Twain 1 +2 Who is Huckleberry Finn's Best Friend? {"Tom Sawyer","His dad","Jake Wiggins","His dog"} Tom Sawyer 1 +3 Who wrote Chuckleberry Finn? {"Mark Twain","JK Rofling",Steinbeck,"Tony Morrison"} Mark Twain 2 +4 Who is Chuckleberry Finn's Best Friend? {"Tom Sawyer","His dad","Jake Wiggins","His cat"} Tom Sawyer 2 +5 In the beginning, the narrator is introduced as? {Samar,"Red, a 200-year-old oak tree",Bongo,Francesca} Red, a 200-year-old oak tree 3 +6 Which time of year do people write down their wishes for Red? {"June 1st",Christmas,"May 1st","Every Monday Morning"} May 1st 3 +7 What does Samar wish for? {"An A on CS 233 Exam","A friend","Her mother to recover from sickness","Acceptance into the philaReads dev team"} A friend 3 +8 What is the name of the Irish orphan that arrived in 1848 {Maeve,Ciara,Anna,Siobhan} Maeve 4 +9 What does the name of the adopted child 'Amadora' mean? {"Gift of life","Gift of hope","Gift of love","Gift of strength"} Gift of love 4 +10 What did the arborists choose to do with Red? {"Chop it down","Write wishes on it","Preserve it"} Chop it down 4 +11 In response to the arborists, what does Stephen and his classmates write on Red {STAY,GOODBYE,FAREWELL,"DONT LEAVE"} STAY 5 +12 What does Francesca read to ultimately change her mind about chopping down Red {"Maeve's journal","A letter written by Stephen's classmates","The wishes on Red"} Maeve's journal 5 +13 In the end, who does Samar become good friends with? {Red,Francesca,Bongo,Stephen} Stephen 5 +14 What grade is Bat in? {2nd,4th,1st,3rd} 3rd 6 +15 What is Bat's mother's occupation? {Veterinarian,Nurse,Teacher,Scientist} Veterinarian 6 +16 What is the name of Bat's skunk? {Winnie,Thor,Bongo,Stripe} Thor 6 +17 How old is Ruby at the start of the book? {8,15,10,11} 11 7 +18 Why can't Ruby see her mother? Where is she? {Hospital,DMV,Prison,"Dev night"} Prison 7 +19 What is the name of Ruby's new friend? {Madeline,Maggie,Margalit,Margaret} Margalit 7 +\. + + +-- +-- Data for Name: questionResult; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public."questionResult" (id, user_answer, correct_answer, correct, quiz_num, question_id, quiz_result_id, question_num) FROM stdin; +\. + + +-- +-- Data for Name: quiz; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public.quiz (id, name, book_id, published) FROM stdin; +1 Huck Finn Quiz 1 1 t +2 Huck Finn Quiz 2 1 t +3 Wish Tree Quiz 1 2 t +4 Wish Tree Quiz 2 2 t +5 Wish Tree Quiz 3 2 t +6 A Boy Called Bat Quiz 1 3 t +7 Ruby on the Outside Quiz 1 4 t +\. + + +-- +-- Data for Name: quizResult; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public."quizResult" (id, num_correct, num_total, date_taken, user_id, quiz_id) FROM stdin; +\. + + +-- +-- Data for Name: user; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public."user" (id, name, password, username, options, is_admin) FROM stdin; +1 Philadelphia READS $2b$12$dxGhO.TbHBQo/58LOzRWNeQ2cuN7v3ldnMsNUnOwz.PdMHd/O.vT6 admin {} t +\. + + +-- +-- Data for Name: year; Type: TABLE DATA; Schema: public; Owner: testusr +-- + +COPY public.year (id, year) FROM stdin; +1 2019 +\. + + +-- +-- Name: book_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public.book_id_seq', 11, true); + + +-- +-- Name: parent_advice_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public.parent_advice_id_seq', 3, true); + + +-- +-- Name: questionResult_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public."questionResult_id_seq"', 1, false); + + +-- +-- Name: question_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public.question_id_seq', 19, true); + + +-- +-- Name: quizResult_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public."quizResult_id_seq"', 1, false); + + +-- +-- Name: quiz_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public.quiz_id_seq', 7, true); + + +-- +-- Name: user_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public.user_id_seq', 1, true); + + +-- +-- Name: year_id_seq; Type: SEQUENCE SET; Schema: public; Owner: testusr +-- + +SELECT pg_catalog.setval('public.year_id_seq', 1, true); + + +-- +-- Name: book book_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.book + ADD CONSTRAINT book_pkey PRIMARY KEY (id); + + +-- +-- Name: parent_advice parent_advice_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.parent_advice + ADD CONSTRAINT parent_advice_pkey PRIMARY KEY (id); + + +-- +-- Name: questionResult questionResult_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."questionResult" + ADD CONSTRAINT "questionResult_pkey" PRIMARY KEY (id); + + +-- +-- Name: question question_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.question + ADD CONSTRAINT question_pkey PRIMARY KEY (id); + + +-- +-- Name: quizResult quizResult_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."quizResult" + ADD CONSTRAINT "quizResult_pkey" PRIMARY KEY (id); + + +-- +-- Name: quiz quiz_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.quiz + ADD CONSTRAINT quiz_pkey PRIMARY KEY (id); + + +-- +-- Name: user user_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."user" + ADD CONSTRAINT user_pkey PRIMARY KEY (id); + + +-- +-- Name: user user_username_key; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."user" + ADD CONSTRAINT user_username_key UNIQUE (username); + + +-- +-- Name: year year_pkey; Type: CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.year + ADD CONSTRAINT year_pkey PRIMARY KEY (id); + + +-- +-- Name: questionResult questionResult_quiz_result_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."questionResult" + ADD CONSTRAINT "questionResult_quiz_result_id_fkey" FOREIGN KEY (quiz_result_id) REFERENCES public."quizResult"(id); + + +-- +-- Name: question question_quiz_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.question + ADD CONSTRAINT question_quiz_id_fkey FOREIGN KEY (quiz_id) REFERENCES public.quiz(id); + + +-- +-- Name: quizResult quizResult_quiz_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."quizResult" + ADD CONSTRAINT "quizResult_quiz_id_fkey" FOREIGN KEY (quiz_id) REFERENCES public.quiz(id); + + +-- +-- Name: quizResult quizResult_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public."quizResult" + ADD CONSTRAINT "quizResult_user_id_fkey" FOREIGN KEY (user_id) REFERENCES public."user"(id); + + +-- +-- Name: quiz quiz_book_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: testusr +-- + +ALTER TABLE ONLY public.quiz + ADD CONSTRAINT quiz_book_id_fkey FOREIGN KEY (book_id) REFERENCES public.book(id); + + +-- +-- PostgreSQL database dump complete +-- + From 96607d8155f995f7c2897e6e8c8775154baa5005 Mon Sep 17 00:00:00 2001 From: tutordelphia Date: Sat, 18 May 2019 19:44:37 -0400 Subject: [PATCH 2/6] Update packages related to security issues requests: 2.18.4 > 2.22.0 SQLAlchemy 1.1.14 > 1.3.3 PyJWT 1.4.2 > 1.7.1 urllib3 1.22 > 1.25.2 --- backend/requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 1cddab4..fb8f59c 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -20,14 +20,14 @@ pg8000==1.12.3 psycopg2==2.7.5 pycparser==2.19; python_version != '3.0.*' pyflakes==1.6.0 -pyjwt==1.4.2 +pyjwt==1.7.1 python-dateutil==2.7.5 python-editor==1.0.3 -requests==2.18.4 +requests==2.22.0 six==1.11.0 sqlalchemy-utils==0.33.5 -sqlalchemy==1.1.14 +sqlalchemy==1.3.3 testing.common.database==2.0.3 testing.postgresql==1.3.0 -urllib3==1.22 +urllib3==1.25.2 werkzeug==0.14.1 From e2a17e5437ea60d8e1a71286ed49b49c38c25387 Mon Sep 17 00:00:00 2001 From: tutordelphia Date: Sat, 18 May 2019 21:17:13 -0400 Subject: [PATCH 3/6] Update versions and specify jwt decode algorithm alembic 0.9.6 > 1.0.10 flask-sqlalchemy 2.3.2 > 2.4.0 pyscopg2 2.7.5 > psycopg2-binary 2.7.5 sqlalchemy-utils 0.33.5 > 0.33.11 werkzeug 0.14.1 > 0.15.4 Specifying a jwt decode algorithm avoids a deprication warning that would have been introduced from these version update commits.w --- backend/api/models/User.py | 6 +++++- backend/api/views/authenticate.py | 2 +- backend/requirements.txt | 10 +++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backend/api/models/User.py b/backend/api/models/User.py index 9ad6d91..014ab80 100644 --- a/backend/api/models/User.py +++ b/backend/api/models/User.py @@ -84,7 +84,11 @@ def decode_auth_token(auth_token): :param auth_token: :return: integer|string """ - payload = jwt.decode(auth_token, current_app.config.get("SECRET_KEY")) + payload = jwt.decode( + auth_token, + current_app.config.get("SECRET_KEY"), + algorithms="HS256" + ) return payload["sub"] # try: # payload = jwt.decode(auth_token, current_app.config.get("SECRET_KEY")) diff --git a/backend/api/views/authenticate.py b/backend/api/views/authenticate.py index 7db091c..e1e581d 100644 --- a/backend/api/views/authenticate.py +++ b/backend/api/views/authenticate.py @@ -1,4 +1,4 @@ -from flask import Flask, jsonify, request, Blueprint, make_response +from flask import Flask, jsonify, request, Blueprint, make_response, current_app from api.models import User, db from api.core import create_response, serialize_list, logger import bcrypt diff --git a/backend/requirements.txt b/backend/requirements.txt index fb8f59c..452753a 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,5 +1,5 @@ -i https://pypi.python.org/simple -alembic==0.9.6 +alembic==1.0.10 bcrypt==3.1.4 certifi==2018.10.15 cffi==1.11.5; python_version != '3.0.*' @@ -8,7 +8,7 @@ click==7.0; python_version != '3.1.*' flask-cors==3.0.6 flask-migrate==2.1.1 flask-script==2.0.6 -flask-sqlalchemy==2.3.2 +flask-sqlalchemy==2.4.0 flask==1.0.2 gunicorn==19.7.1 idna==2.6 @@ -17,7 +17,7 @@ jinja2==2.10 mako==1.0.7 markupsafe==1.1.0; python_version != '3.1.*' pg8000==1.12.3 -psycopg2==2.7.5 +psycopg2-binary==2.7.5 pycparser==2.19; python_version != '3.0.*' pyflakes==1.6.0 pyjwt==1.7.1 @@ -25,9 +25,9 @@ python-dateutil==2.7.5 python-editor==1.0.3 requests==2.22.0 six==1.11.0 -sqlalchemy-utils==0.33.5 +sqlalchemy-utils==0.33.11 sqlalchemy==1.3.3 testing.common.database==2.0.3 testing.postgresql==1.3.0 urllib3==1.25.2 -werkzeug==0.14.1 +werkzeug==0.15.4 From 5d4a94228c4c2b5e1cfa08417f0006592455c594 Mon Sep 17 00:00:00 2001 From: tutordelphia Date: Sat, 18 May 2019 21:33:36 -0400 Subject: [PATCH 4/6] code formating and remove unused import --- backend/api/models/User.py | 4 +--- backend/api/views/authenticate.py | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/api/models/User.py b/backend/api/models/User.py index 014ab80..c22480b 100644 --- a/backend/api/models/User.py +++ b/backend/api/models/User.py @@ -85,9 +85,7 @@ def decode_auth_token(auth_token): :return: integer|string """ payload = jwt.decode( - auth_token, - current_app.config.get("SECRET_KEY"), - algorithms="HS256" + auth_token, current_app.config.get("SECRET_KEY"), algorithms="HS256" ) return payload["sub"] # try: diff --git a/backend/api/views/authenticate.py b/backend/api/views/authenticate.py index e1e581d..7db091c 100644 --- a/backend/api/views/authenticate.py +++ b/backend/api/views/authenticate.py @@ -1,4 +1,4 @@ -from flask import Flask, jsonify, request, Blueprint, make_response, current_app +from flask import Flask, jsonify, request, Blueprint, make_response from api.models import User, db from api.core import create_response, serialize_list, logger import bcrypt From e06ba2e4f20857c693ce63d6e56563e59b3d96e9 Mon Sep 17 00:00:00 2001 From: Adam Levin Date: Sat, 25 May 2019 07:49:39 -0400 Subject: [PATCH 5/6] updates pipfile and requirements to fix security requirements.txt is generated by pipfile so fixing pipfile should have been the first step. This commit should fix the outdated libraries that had security issues. --- backend/Pipfile | 14 +- backend/Pipfile.lock | 315 +++++++++++++++++------------------ backend/requirements-dev.txt | 17 +- backend/requirements.txt | 27 +-- 4 files changed, 184 insertions(+), 189 deletions(-) diff --git a/backend/Pipfile b/backend/Pipfile index 2a3f93e..1023634 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -4,21 +4,21 @@ verify_ssl = true name = "pypi" [packages] -alembic = "==0.9.6" +alembic = "==1.0.10" Flask-Migrate = "==2.1.1" Flask-Script = "==2.0.6" -Flask-SQLAlchemy = "==2.3.2" +Flask-SQLAlchemy = "==2.4.0" gunicorn = "==19.7.1" "psycopg2-binary" = "==2.7.5" pyflakes = "==1.6.0" -requests = "==2.18.4" -SQLAlchemy = "==1.1.14" -"urllib3" = "==1.22" +requests = "==2.22.0" +SQLAlchemy = "==1.3.3" +"urllib3" = "==1.25.2" Flask-Cors = "==3.0.6" flask-script = "==2.0.6" -sqlalchemy-utils = "==0.33.5" +sqlalchemy-utils = "==0.33.11" flask = "==1.0.2" -pyjwt = "==1.4.2" +pyjwt = "==1.7.1" bcrypt = "==3.1.4" "testing.postgresql" = "==1.3.0" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index a668b01..0b90c68 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e3c2234c7230ef1bd36a29f161355095c0a174447a2f8d689ab12414d2897940" + "sha256": "7c04dbf4d9fc047b136cfbc487e45645f906813006769dc37444506b340d286b" }, "pipfile-spec": 6, "requires": { @@ -18,10 +18,10 @@ "default": { "alembic": { "hashes": [ - "sha256:042851ebe9efa07be6dc1395b1793b6c1d8964a39b73a0ce1649e2bcd41ea732" + "sha256:828dcaa922155a2b7166c4f36ec45268944e4055c86499bd14319b4c8c0094b7" ], "index": "pypi", - "version": "==0.9.6" + "version": "==1.0.10" }, "bcrypt": { "hashes": [ @@ -65,48 +65,43 @@ }, "certifi": { "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" + "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", + "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" ], - "version": "==2018.11.29" + "version": "==2019.3.9" }, "cffi": { "hashes": [ - "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743", - "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef", - "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50", - "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f", - "sha256:3bb6bd7266598f318063e584378b8e27c67de998a43362e8fce664c54ee52d30", - "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93", - "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257", - "sha256:495c5c2d43bf6cebe0178eb3e88f9c4aa48d8934aa6e3cddb865c058da76756b", - "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3", - "sha256:57b2533356cb2d8fac1555815929f7f5f14d68ac77b085d2326b571310f34f6e", - "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc", - "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04", - "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6", - "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359", - "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596", - "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b", - "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd", - "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95", - "sha256:a6a5cb8809091ec9ac03edde9304b3ad82ad4466333432b16d78ef40e0cce0d5", - "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e", - "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6", - "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca", - "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31", - "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1", - "sha256:ca1bd81f40adc59011f58159e4aa6445fc585a32bb8ac9badf7a2c1aa23822f2", - "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085", - "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801", - "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4", - "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184", - "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917", - "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f", - "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb" - ], - "markers": "python_version != '3.2.*' and python_version != '3.3.*' and python_version >= '2.7' and python_version != '3.1.*' and python_version != '3.0.*'", - "version": "==1.11.5" + "sha256:041c81822e9f84b1d9c401182e174996f0bae9991f33725d059b771744290774", + "sha256:046ef9a22f5d3eed06334d01b1e836977eeef500d9b78e9ef693f9380ad0b83d", + "sha256:066bc4c7895c91812eff46f4b1c285220947d4aa46fa0a2651ff85f2afae9c90", + "sha256:066c7ff148ae33040c01058662d6752fd73fbc8e64787229ea8498c7d7f4041b", + "sha256:2444d0c61f03dcd26dbf7600cf64354376ee579acad77aef459e34efcb438c63", + "sha256:300832850b8f7967e278870c5d51e3819b9aad8f0a2c8dbe39ab11f119237f45", + "sha256:34c77afe85b6b9e967bd8154e3855e847b70ca42043db6ad17f26899a3df1b25", + "sha256:46de5fa00f7ac09f020729148ff632819649b3e05a007d286242c4882f7b1dc3", + "sha256:4aa8ee7ba27c472d429b980c51e714a24f47ca296d53f4d7868075b175866f4b", + "sha256:4d0004eb4351e35ed950c14c11e734182591465a33e960a4ab5e8d4f04d72647", + "sha256:4e3d3f31a1e202b0f5a35ba3bc4eb41e2fc2b11c1eff38b362de710bcffb5016", + "sha256:50bec6d35e6b1aaeb17f7c4e2b9374ebf95a8975d57863546fa83e8d31bdb8c4", + "sha256:55cad9a6df1e2a1d62063f79d0881a414a906a6962bc160ac968cc03ed3efcfb", + "sha256:5662ad4e4e84f1eaa8efce5da695c5d2e229c563f9d5ce5b0113f71321bcf753", + "sha256:59b4dc008f98fc6ee2bb4fd7fc786a8d70000d058c2bbe2698275bc53a8d3fa7", + "sha256:73e1ffefe05e4ccd7bcea61af76f36077b914f92b76f95ccf00b0c1b9186f3f9", + "sha256:a1f0fd46eba2d71ce1589f7e50a9e2ffaeb739fb2c11e8192aa2b45d5f6cc41f", + "sha256:a2e85dc204556657661051ff4bab75a84e968669765c8a2cd425918699c3d0e8", + "sha256:a5457d47dfff24882a21492e5815f891c0ca35fefae8aa742c6c263dac16ef1f", + "sha256:a8dccd61d52a8dae4a825cdbb7735da530179fea472903eb871a5513b5abbfdc", + "sha256:ae61af521ed676cf16ae94f30fe202781a38d7178b6b4ab622e4eec8cefaff42", + "sha256:b012a5edb48288f77a63dba0840c92d0504aa215612da4541b7b42d849bc83a3", + "sha256:d2c5cfa536227f57f97c92ac30c8109688ace8fa4ac086d19d0af47d134e2909", + "sha256:d42b5796e20aacc9d15e66befb7a345454eef794fdb0737d1af593447c6c8f45", + "sha256:dee54f5d30d775f525894d67b1495625dd9322945e7fee00731952e0368ff42d", + "sha256:e070535507bd6aa07124258171be2ee8dfc19119c28ca94c9dfb7efd23564512", + "sha256:e1ff2748c84d97b065cc95429814cdba39bcbd77c9c85c89344b317dc0d9cbff", + "sha256:ed851c75d1e0e043cbf5ca9a8e1b13c4c90f3fbd863dacb01c0808e2b5204201" + ], + "version": "==1.12.3" }, "chardet": { "hashes": [ @@ -120,7 +115,6 @@ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" ], - "markers": "python_version != '3.3.*' and python_version != '3.0.*' and python_version != '3.2.*' and python_version >= '2.7' and python_version != '3.1.*'", "version": "==7.0" }, "flask": { @@ -156,11 +150,11 @@ }, "flask-sqlalchemy": { "hashes": [ - "sha256:3bc0fac969dd8c0ace01b32060f0c729565293302f0c4269beed154b46bec50b", - "sha256:5971b9852b5888655f11db634e87725a9031e170f37c0ce7851cf83497f56e53" + "sha256:0c9609b0d72871c540a7945ea559c8fdf5455192d2db67219509aed680a3d45a", + "sha256:8631bbea987bc3eb0f72b1f691d47bd37ceb795e73b59ab48586d76d75a7c605" ], "index": "pypi", - "version": "==2.3.2" + "version": "==2.4.0" }, "gunicorn": { "hashes": [ @@ -172,72 +166,77 @@ }, "idna": { "hashes": [ - "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f", - "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4" + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" ], - "version": "==2.6" + "version": "==2.8" }, "itsdangerous": { "hashes": [ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" ], - "markers": "python_version != '3.3.*' and python_version != '3.0.*' and python_version >= '2.7' and python_version != '3.2.*' and python_version != '3.1.*'", "version": "==1.1.0" }, "jinja2": { "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013", + "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b" ], - "version": "==2.10" + "version": "==2.10.1" }, "mako": { "hashes": [ - "sha256:4e02fde57bd4abb5ec400181e4c314f56ac3e49ba4fb8b0d50bba18cb27d25ae" + "sha256:7165919e78e1feb68b4dbe829871ea9941398178fa58e6beedb9ba14acf63965" ], - "version": "==1.0.7" + "version": "==1.0.10" }, "markupsafe": { "hashes": [ - "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", - "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", - "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", - "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", - "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", - "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", - "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", - "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", - "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", - "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", - "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", - "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", - "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", - "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", - "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", - "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", - "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", - "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", - "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", - "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", - "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", - "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", - "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", - "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", - "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", - "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", - "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", - "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1" - ], - "markers": "python_version != '3.3.*' and python_version != '3.0.*' and python_version >= '2.7' and python_version != '3.2.*' and python_version != '3.1.*'", - "version": "==1.1.0" + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7" + ], + "version": "==1.1.1" + }, + "passlib": { + "hashes": [ + "sha256:3d948f64138c25633613f303bcc471126eae67c04d5e3f6b7b8ce6242f8653e0", + "sha256:43526aea08fa32c6b6dbbbe9963c4c767285b78147b7437597f992812f69d280" + ], + "version": "==1.7.1" }, "pg8000": { "hashes": [ - "sha256:18192d90409a3037619ef17f1924e3fd9c7169c9c1b3277cec1982116ec2b6de", - "sha256:81e461583c25c4de9994b890187057dd5857f0d6f7569bf4eaf00c9973d94422" + "sha256:2208c7aaffe8d61f5c4ccbefeb74ba033003899e64aee37c0eb98aadae8b9c6b", + "sha256:29a5f32e9b68ca5b6ac5e334cc30fae652ec20c551d5eaa46adb3f24419e94de" ], - "version": "==1.12.3" + "version": "==1.13.1" }, "psycopg2-binary": { "hashes": [ @@ -279,7 +278,6 @@ "hashes": [ "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" ], - "markers": "python_version != '3.2.*' and python_version != '3.3.*' and python_version >= '2.7' and python_version != '3.1.*' and python_version != '3.0.*'", "version": "==2.19" }, "pyflakes": { @@ -292,53 +290,55 @@ }, "pyjwt": { "hashes": [ - "sha256:87a831b7a3bfa8351511961469ed0462a769724d4da48a501cb8c96d1e17f570", - "sha256:99fe612dbe5f41e07124d9002c118c14f3ee703574ffa9779fee78135b8b94b6" + "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e", + "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96" ], "index": "pypi", - "version": "==1.4.2" + "version": "==1.7.1" }, "python-dateutil": { "hashes": [ - "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", - "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" + "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", + "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" ], - "version": "==2.7.5" + "version": "==2.8.0" }, "python-editor": { "hashes": [ - "sha256:a3c066acee22a1c94f63938341d4fb374e3fdd69366ed6603d7b24bed1efc565" + "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d", + "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b", + "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8" ], - "version": "==1.0.3" + "version": "==1.0.4" }, "requests": { "hashes": [ - "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", - "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e" + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" ], "index": "pypi", - "version": "==2.18.4" + "version": "==2.22.0" }, "six": { "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" ], - "version": "==1.11.0" + "version": "==1.12.0" }, "sqlalchemy": { "hashes": [ - "sha256:f1191e29e35b6fe1aef7175a09b1707ebb7bd08d0b17cb0feada76c49e5a2d1e" + "sha256:91c54ca8345008fceaec987e10924bf07dcab36c442925357e5a467b36a38319" ], "index": "pypi", - "version": "==1.1.14" + "version": "==1.3.3" }, "sqlalchemy-utils": { "hashes": [ - "sha256:d57246d50a54143140c097c6d80c3ac70c47396f44dffd263dc6c8024b3e367c" + "sha256:3f1cb542cf0549a0de508d4919f3ad693a36230bf4cd13fdd6253549fec71182" ], "index": "pypi", - "version": "==0.33.5" + "version": "==0.33.11" }, "testing.common.database": { "hashes": [ @@ -357,18 +357,18 @@ }, "urllib3": { "hashes": [ - "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b", - "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f" + "sha256:a53063d8b9210a7bdec15e7b272776b9d42b2fd6816401a0d43006ad2f9902db", + "sha256:d363e3607d8de0c220d31950a8f38b18d5ba7c0830facd71a1c6b1036b7ce06c" ], "index": "pypi", - "version": "==1.22" + "version": "==1.25.2" }, "werkzeug": { "hashes": [ - "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c", - "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b" + "sha256:865856ebb55c4dcd0630cdd8f3331a1847a819dda7e8c750d3db6f2aa6c0209c", + "sha256:a0b915f0815982fb2a09161cb8f31708052d0951c3ba433ccc5e1aa276507ca6" ], - "version": "==0.14.1" + "version": "==0.15.4" } }, "develop": { @@ -381,18 +381,17 @@ }, "atomicwrites": { "hashes": [ - "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", - "sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee" + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" ], - "markers": "python_version != '3.1.*' and python_version != '3.0.*' and python_version != '3.2.*' and python_version != '3.3.*' and python_version >= '2.7'", - "version": "==1.2.1" + "version": "==1.3.0" }, "attrs": { "hashes": [ - "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", - "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" + "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", + "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" ], - "version": "==18.2.0" + "version": "==19.1.0" }, "black": { "hashes": [ @@ -407,7 +406,6 @@ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" ], - "markers": "python_version != '3.3.*' and python_version != '3.0.*' and python_version != '3.2.*' and python_version >= '2.7' and python_version != '3.1.*'", "version": "==7.0" }, "flake8": { @@ -427,11 +425,10 @@ }, "more-itertools": { "hashes": [ - "sha256:c187a73da93e7a8acc0001572aebc7e3c69daf7bf6881a2cea10650bd4420092", - "sha256:c476b5d3a34e12d40130bc2f935028b5f636df8f372dc2c1c01dc19681b2039e", - "sha256:fcbfeaea0be121980e15bc97b3817b5202ca73d0eae185b4550cbfce2a3ebb3d" + "sha256:2112d2ca570bb7c3e53ea1a35cd5df42bb0fd10c45f0fb97178679c3c03d64c7", + "sha256:c3e4748ba1aad8dba30a4886b0b1a2004f9a863837b8654e7059eebf727afa5a" ], - "version": "==4.3.0" + "version": "==7.0.0" }, "mypy": { "hashes": [ @@ -450,19 +447,17 @@ }, "pluggy": { "hashes": [ - "sha256:447ba94990e8014ee25ec853339faf7b0fc8050cdc3289d4d71f7f410fb90095", - "sha256:bde19360a8ec4dfd8a20dcb811780a30998101f078fc7ded6162f0076f50508f" + "sha256:25a1bc1d148c9a640211872b4ff859878d422bccb59c9965e04eed468a0aa180", + "sha256:964cedd2b27c492fbf0b7f58b3284a09cf7f99b0f715941fb24a439b3af1bd1a" ], - "markers": "python_version >= '2.7' and python_version != '3.0.*' and python_version != '3.3.*' and python_version != '3.1.*' and python_version != '3.2.*'", - "version": "==0.8.0" + "version": "==0.11.0" }, "py": { "hashes": [ - "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", - "sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6" + "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", + "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" ], - "markers": "python_version >= '2.7' and python_version != '3.0.*' and python_version != '3.3.*' and python_version != '3.1.*' and python_version != '3.2.*'", - "version": "==1.7.0" + "version": "==1.8.0" }, "pycodestyle": { "hashes": [ @@ -489,10 +484,10 @@ }, "six": { "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" ], - "version": "==1.11.0" + "version": "==1.12.0" }, "toml": { "hashes": [ @@ -503,31 +498,29 @@ }, "typed-ast": { "hashes": [ - "sha256:0948004fa228ae071054f5208840a1e88747a357ec1101c17217bfe99b299d58", - "sha256:10703d3cec8dcd9eef5a630a04056bbc898abc19bac5691612acba7d1325b66d", - "sha256:1f6c4bd0bdc0f14246fd41262df7dfc018d65bb05f6e16390b7ea26ca454a291", - "sha256:25d8feefe27eb0303b73545416b13d108c6067b846b543738a25ff304824ed9a", - "sha256:29464a177d56e4e055b5f7b629935af7f49c196be47528cc94e0a7bf83fbc2b9", - "sha256:2e214b72168ea0275efd6c884b114ab42e316de3ffa125b267e732ed2abda892", - "sha256:3e0d5e48e3a23e9a4d1a9f698e32a542a4a288c871d33ed8df1b092a40f3a0f9", - "sha256:519425deca5c2b2bdac49f77b2c5625781abbaf9a809d727d3a5596b30bb4ded", - "sha256:57fe287f0cdd9ceaf69e7b71a2e94a24b5d268b35df251a88fef5cc241bf73aa", - "sha256:668d0cec391d9aed1c6a388b0d5b97cd22e6073eaa5fbaa6d2946603b4871efe", - "sha256:68ba70684990f59497680ff90d18e756a47bf4863c604098f10de9716b2c0bdd", - "sha256:6de012d2b166fe7a4cdf505eee3aaa12192f7ba365beeefaca4ec10e31241a85", - "sha256:79b91ebe5a28d349b6d0d323023350133e927b4de5b651a8aa2db69c761420c6", - "sha256:8550177fa5d4c1f09b5e5f524411c44633c80ec69b24e0e98906dd761941ca46", - "sha256:898f818399cafcdb93cbbe15fc83a33d05f18e29fb498ddc09b0214cdfc7cd51", - "sha256:94b091dc0f19291adcb279a108f5d38de2430411068b219f41b343c03b28fb1f", - "sha256:a26863198902cda15ab4503991e8cf1ca874219e0118cbf07c126bce7c4db129", - "sha256:a8034021801bc0440f2e027c354b4eafd95891b573e12ff0418dec385c76785c", - "sha256:bc978ac17468fe868ee589c795d06777f75496b1ed576d308002c8a5756fb9ea", - "sha256:c05b41bc1deade9f90ddc5d988fe506208019ebba9f2578c622516fd201f5863", - "sha256:c9b060bd1e5a26ab6e8267fd46fc9e02b54eb15fffb16d112d4c7b1c12987559", - "sha256:edb04bdd45bfd76c8292c4d9654568efaedf76fe78eb246dde69bdb13b2dad87", - "sha256:f19f2a4f547505fe9072e15f6f4ae714af51b5a681a97f187971f50c283193b6" - ], - "version": "==1.1.0" + "sha256:0cf0c406af2a6472a02254fe1ced40cb81a7c1215b7ceba88a3bb9c3a864f851", + "sha256:1b784cd3c6778cd7b99afb41ddcaa1eb5b35a399210db7fcf24ed082670e0070", + "sha256:2d7a322c1df6cccff2381c0475c1ebf82d3e9a331e48ed4ea89bbc72a8dedca6", + "sha256:4304399ff89452871348f6fb7a7112454cd508fbe3eb49b5ed711cce9b99fe9e", + "sha256:4658aebc30c0af80e63b579e917c04b592bdf10ef40da381b2fd179075b5d1b6", + "sha256:471a7f12e55ad22f7a4bb2c3e62e39e3ab78008b24c61c48c9042e63b7359bb9", + "sha256:57cb23412dac214383c6b6f0f7b0aec2d0c001a936af20f0b53542bbe4ba08a7", + "sha256:5eb14e6b3aa5ff5d7e964b978a718227b5576b3965f1dd71dd055f71054233a5", + "sha256:8219b6147af4d609096b6db2c797281e19fd3f7232ef35932bc74a812ff417a0", + "sha256:8a7e9635cf0aaca04b2a4d4b3501c0dbc5c49a140b2e55b00e218d41ed2a69c8", + "sha256:935157ada4aa115d61c59e759e43c5862b04d19ffe6fe5c9d735716587535cb7", + "sha256:9525f4cbe3eb7b9e19a87c765ca9bbc1147ce18f75059e15138eb7fc59ce02e3", + "sha256:99c140583eef6b50f3de4af44718a4fc63108671b29c468b5ff83ed383facf6d", + "sha256:9e358ce6d4c43a90c15b99b76261adc852998680628c780f26fd64bc21adb9fa", + "sha256:aaf63a024b54d2788cff3400de79009ee8a23594b581d4f33d90b7c67f8c05bd", + "sha256:c3313b3fa1b6b722866eda370c14fd8f4962b6bcd1f6d43f42d6818a8b29d998", + "sha256:c9342947e5f3480473d836754d69965a12ac2237d99ae85d1e3fdd1c1722669f", + "sha256:cb1c7e5b3195103f5a784db7969fc55463cfae9b354e3b97cc219d32293d5e65", + "sha256:d2d2cce74165cae2663167c921e331fb0eecfff2e93254dfdb16beb99716e519", + "sha256:d6fc3b9fbf67d556223aa5493501022e1d585b9a1892fa87ba1257627763c461", + "sha256:fa4eafaa57074958f065c2a6222d8f11162739f8c9db125472a1f04794a0b91d" + ], + "version": "==1.1.2" } } } diff --git a/backend/requirements-dev.txt b/backend/requirements-dev.txt index 9a2bb00..ecdcaf7 100644 --- a/backend/requirements-dev.txt +++ b/backend/requirements-dev.txt @@ -1,19 +1,20 @@ -i https://pypi.python.org/simple appdirs==1.4.3 -atomicwrites==1.2.1; python_version >= '2.7' -attrs==18.2.0 +atomicwrites==1.3.0 +attrs==19.1.0 black==18.6b4 -click==7.0; python_version != '3.1.*' +click==7.0 flake8==3.5.0 mccabe==0.6.1 -more-itertools==4.3.0 +more-itertools==7.0.0 mypy-extensions==0.4.1 mypy==0.630 -pluggy==0.8.0; python_version != '3.2.*' -py==1.7.0; python_version != '3.2.*' +pluggy==0.11.0 +py==1.8.0 pycodestyle==2.3.1 pyflakes==1.6.0 pytest==3.8.2 -six==1.11.0 +six==1.12.0 toml==0.10.0 -typed-ast==1.1.0 +typed-ast==1.1.2 + diff --git a/backend/requirements.txt b/backend/requirements.txt index 452753a..26dd0df 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,30 +1,31 @@ -i https://pypi.python.org/simple alembic==1.0.10 bcrypt==3.1.4 -certifi==2018.10.15 -cffi==1.11.5; python_version != '3.0.*' +certifi==2019.3.9 +cffi==1.12.3 chardet==3.0.4 -click==7.0; python_version != '3.1.*' +click==7.0 flask-cors==3.0.6 flask-migrate==2.1.1 flask-script==2.0.6 flask-sqlalchemy==2.4.0 flask==1.0.2 gunicorn==19.7.1 -idna==2.6 -itsdangerous==1.1.0; python_version != '3.1.*' -jinja2==2.10 -mako==1.0.7 -markupsafe==1.1.0; python_version != '3.1.*' -pg8000==1.12.3 +idna==2.8 +itsdangerous==1.1.0 +jinja2==2.10.1 +mako==1.0.10 +markupsafe==1.1.1 +passlib==1.7.1 +pg8000==1.13.1 psycopg2-binary==2.7.5 -pycparser==2.19; python_version != '3.0.*' +pycparser==2.19 pyflakes==1.6.0 pyjwt==1.7.1 -python-dateutil==2.7.5 -python-editor==1.0.3 +python-dateutil==2.8.0 +python-editor==1.0.4 requests==2.22.0 -six==1.11.0 +six==1.12.0 sqlalchemy-utils==0.33.11 sqlalchemy==1.3.3 testing.common.database==2.0.3 From 49ccec6668635f96f42a363e57d905c9c5f9c430 Mon Sep 17 00:00:00 2001 From: Adam Levin Date: Sat, 25 May 2019 23:46:25 -0400 Subject: [PATCH 6/6] badges are labeled with current year Using the db table Year which stores a single value (what the current year is) the badges will display the current year. --- backend/api/models/Badge.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/api/models/Badge.py b/backend/api/models/Badge.py index 3ff3874..ca41810 100644 --- a/backend/api/models/Badge.py +++ b/backend/api/models/Badge.py @@ -1,4 +1,5 @@ from api.models import Quiz +from api.models.Year import Year # this file and the classes in it do not correspond to a table in the Database @@ -20,6 +21,8 @@ def can_receive(self, user, quiz_result): return user.progress >= self.quantity def serialize_to_json(self): + if len(Year.query.all()) == 0: + raise ValueError("Year not initialized") return { "id": self.id, "title": self.title, @@ -27,7 +30,7 @@ def serialize_to_json(self): "description": self.description, "congrats_text": self.congrats_text, "graphic": self.graphic, - "year": 2018, # if we get a table in to track current year we need to use that + "year": Year.query.get(1).year, }