47 |
48 | 📦
49 |
50 |
51 |
52 |
53 |
54 | 📜
55 |
56 |
57 |
58 |
118 |
119 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | import json
2 | from json.decoder import JSONDecoder
3 | from flask import Flask, render_template, request, redirect, send_from_directory
4 | import requests
5 | from types import SimpleNamespace, resolve_bases
6 | import random
7 | import os
8 |
9 | app = Flask(__name__)
10 |
11 | hostURL = "https://startupguidedeveloper.herokuapp.com"
12 | loggedInUsers = {}
13 |
14 | accessToken = ""
15 | refreshToken = ""
16 |
17 | class user():
18 | def __init__(self,username, email, accessToken, refreshToken) -> None:
19 | self.username = username
20 | self.email = email
21 | self.accessToken = accessToken
22 | self.refreshToken = refreshToken
23 |
24 | class item (object):
25 | def __init__(self, _id,name,category, description, link, thumbnail ) -> None:
26 | self.name = name
27 | self._id = _id
28 | self.category = category
29 | self.description = description
30 | self.link = link
31 | self.thumbnail = thumbnail
32 |
33 | # def decodeObject(obj):
34 | # if '__type__' in obj and obj['__type__'] == 'item':
35 | # return item(obj['name'], obj['_id'], obj['category'], obj['description'], obj['link'], obj['thumbnail'])
36 | # return obj
37 |
38 | @app.route('/favicon.ico')
39 | def favicon():
40 | return send_from_directory(os.path.join(app.root_path, 'static'),
41 | 'favicon.ico', mimetype='image/vnd.microsoft.icon')
42 |
43 | @app.route('/')
44 | def connection():
45 | return render_template('base.html')
46 |
47 | @app.route('/authentication', methods = ['GET', 'POST'])
48 | def authentication():
49 | return render_template('login.html')
50 |
51 | @app.route('/login', methods = ['GET', 'POST'])
52 | def login():
53 | if request.method == "POST":
54 | data = {"email" : request.form['email'], "name" : request.form['Username'], "password" : request.form['password']}
55 | headers = {"content-type" : "application/json"}
56 | r = requests.post(f"{hostURL}/api/auth/login", json=data, headers = headers)
57 |
58 | if r.status_code == 200:
59 | newUser = user(username=request.form['Username'], email=request.form['email'], accessToken= data['accessToken'], refreshToken=data['refreshToken'])
60 | newUserID = random.randint(1000000, 9999999)
61 | loggedInUsers[newUserID] = newUser
62 | return redirect(f'/homepage/{data["accessToken"]}/{newUserID}')
63 | else :
64 | return redirect(f"/error/{r.status_code}/{r.text}")
65 | else :
66 | return "Sorry this route is not accessable"
67 |
68 | @app.route('/error/
/', methods = ['POST', 'GET'])
69 | def error(statuscode, error):
70 | return render_template('errorPage.html', statuscode = statuscode, error = error )
71 |
72 | @app.route('/homepage//', methods = ['GET', 'POST'])
73 | def home(accessToken, userID):
74 | if (loggedInUsers[int(userID)].accessToken == accessToken):
75 | user = loggedInUsers[int(userID)]
76 | r = requests.get(f"{hostURL}/api/getAllBooks")
77 | books = []
78 | for element in r.json():
79 | newItem = item(element['_id'],element['name'],element['category'], element['description'], element['link'], element['thumbnail'])
80 | books.append(newItem)
81 |
82 | r = requests.get(f"{hostURL}/api/getAllBlogs")
83 | blogs = []
84 | for element in r.json():
85 | newItem = item(element['_id'],element['name'],element['category'], element['description'], element['link'], element['thumbnail'])
86 | blogs.append(newItem)
87 |
88 | r = requests.get(f"{hostURL}/api/getAllNewsletters")
89 | newsletters = []
90 | for element in r.json():
91 | newItem = item(element['_id'],element['name'],element['category'], element['description'], element['link'], element['thumbnail'])
92 | newsletters.append(newItem)
93 |
94 | r = requests.get(f"{hostURL}/api/getAllStartupStories")
95 | startupStories = []
96 | for element in r.json():
97 | newItem = item(element['_id'],element['name'],element['category'], element['description'], element['link'], element['thumbnail'])
98 | startupStories.append(newItem)
99 |
100 | r = requests.get(f"{hostURL}/api/getAllYoutubeChannels")
101 | youtubeChannels = []
102 | for element in r.json():
103 | newItem = item(element['_id'],element['name'],element['category'], element['description'], element['link'], element['thumbnail'])
104 | youtubeChannels.append(newItem)
105 |
106 | r = requests.get(f"{hostURL}/api/getAllPodcasts")
107 | podcasts = []
108 | for element in r.json():
109 | newItem = item(element['_id'],element['name'],element['category'], element['description'], element['link'], element['thumbnail'])
110 | podcasts.append(newItem)
111 |
112 | r = requests.get(f"{hostURL}/api/getAllTweets")
113 | tweets = []
114 | for element in r.json():
115 | newItem = item(element['_id'],element['name'],element['category'], element['description'], element['link'], element['thumbnail'])
116 | tweets.append(newItem)
117 |
118 | return render_template('Homepage.html',userID = userID ,user = user, books = books, blogs = blogs, newsletters = newsletters, startupStories = startupStories, youtubeChannels = youtubeChannels, podcasts = podcasts, tweets = tweets)
119 | else :
120 | return "Sorry, detected token from malicious route"
121 |
122 | @app.route('/addItem//' ,methods = ['POST', 'GET'])
123 | def addItem(token, userID):
124 | if request.method == 'POST':
125 | print(request.form['name'])
126 | body = {
127 | "name" : request.form['name'],
128 | "category" : request.form['category'],
129 | "thumbnail" : request.form['thumbnail'],
130 | "link" : request.form['link'],
131 | "description" : request.form['description']
132 | }
133 | headers = {
134 | "content-type" : "application/json",
135 | "authorization" : f"Bearer {token}"
136 | }
137 | response = requests.post(f"{hostURL}/api/add{request.form['category']}", json = body, headers=headers)
138 |
139 | return render_template('addItemPage.html', token = token, userID = userID)
140 |
141 | if __name__ == "__main__" :
142 | app.run(debug=True)
143 |
--------------------------------------------------------------------------------
/Pipfile.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_meta": {
3 | "hash": {
4 | "sha256": "ca23c1d1549045c1fedc72fea7ed9ca6b14eeb5b8fcb7eeda6857dedd0cf05a0"
5 | },
6 | "pipfile-spec": 6,
7 | "requires": {
8 | "python_version": "3.9"
9 | },
10 | "sources": [
11 | {
12 | "name": "pypi",
13 | "url": "https://pypi.org/simple",
14 | "verify_ssl": true
15 | }
16 | ]
17 | },
18 | "default": {
19 | "certifi": {
20 | "hashes": [
21 | "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee",
22 | "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"
23 | ],
24 | "version": "==2021.5.30"
25 | },
26 | "charset-normalizer": {
27 | "hashes": [
28 | "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b",
29 | "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"
30 | ],
31 | "markers": "python_version >= '3'",
32 | "version": "==2.0.4"
33 | },
34 | "click": {
35 | "hashes": [
36 | "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a",
37 | "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"
38 | ],
39 | "markers": "python_version >= '3.6'",
40 | "version": "==8.0.1"
41 | },
42 | "flask": {
43 | "hashes": [
44 | "sha256:1c4c257b1892aec1398784c63791cbaa43062f1f7aeb555c4da961b20ee68f55",
45 | "sha256:a6209ca15eb63fc9385f38e452704113d679511d9574d09b2cf9183ae7d20dc9"
46 | ],
47 | "index": "pypi",
48 | "version": "==2.0.1"
49 | },
50 | "gunicorn": {
51 | "hashes": [
52 | "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e",
53 | "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"
54 | ],
55 | "index": "pypi",
56 | "version": "==20.1.0"
57 | },
58 | "idna": {
59 | "hashes": [
60 | "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a",
61 | "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"
62 | ],
63 | "markers": "python_version >= '3'",
64 | "version": "==3.2"
65 | },
66 | "itsdangerous": {
67 | "hashes": [
68 | "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c",
69 | "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"
70 | ],
71 | "markers": "python_version >= '3.6'",
72 | "version": "==2.0.1"
73 | },
74 | "jinja2": {
75 | "hashes": [
76 | "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4",
77 | "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"
78 | ],
79 | "markers": "python_version >= '3.6'",
80 | "version": "==3.0.1"
81 | },
82 | "markupsafe": {
83 | "hashes": [
84 | "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298",
85 | "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64",
86 | "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b",
87 | "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567",
88 | "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff",
89 | "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724",
90 | "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74",
91 | "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646",
92 | "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35",
93 | "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6",
94 | "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6",
95 | "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad",
96 | "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26",
97 | "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38",
98 | "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac",
99 | "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7",
100 | "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6",
101 | "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75",
102 | "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f",
103 | "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135",
104 | "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8",
105 | "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a",
106 | "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a",
107 | "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9",
108 | "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864",
109 | "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914",
110 | "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18",
111 | "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8",
112 | "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2",
113 | "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d",
114 | "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b",
115 | "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b",
116 | "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f",
117 | "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb",
118 | "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833",
119 | "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28",
120 | "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415",
121 | "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902",
122 | "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d",
123 | "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9",
124 | "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d",
125 | "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145",
126 | "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066",
127 | "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c",
128 | "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1",
129 | "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f",
130 | "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53",
131 | "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134",
132 | "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85",
133 | "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5",
134 | "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94",
135 | "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509",
136 | "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51",
137 | "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"
138 | ],
139 | "markers": "python_version >= '3.6'",
140 | "version": "==2.0.1"
141 | },
142 | "requests": {
143 | "hashes": [
144 | "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
145 | "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
146 | ],
147 | "index": "pypi",
148 | "version": "==2.26.0"
149 | },
150 | "urllib3": {
151 | "hashes": [
152 | "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4",
153 | "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"
154 | ],
155 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
156 | "version": "==1.26.6"
157 | },
158 | "werkzeug": {
159 | "hashes": [
160 | "sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42",
161 | "sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8"
162 | ],
163 | "markers": "python_version >= '3.6'",
164 | "version": "==2.0.1"
165 | }
166 | },
167 | "develop": {}
168 | }
169 |
--------------------------------------------------------------------------------
/templates/Homepage.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
12 |
13 | HomePage@STG
14 |
15 |
16 |
17 |
18 |
43 |
44 |
45 |
46 |

48 |
Management@Startup-Guide
49 |
50 |
51 |
52 |
53 |
54 |
Books
55 |
56 |
57 |
58 |
59 | | Serial |
60 | Item ID |
61 | Name |
62 | Category |
63 | Description |
64 | Link |
65 |
66 |
67 |
68 | {% for element in books %}
69 |
70 | | {{loop.index}} |
71 | {{element._id}} |
72 | {{element.name}} |
73 | {{element.category}} |
74 | {{element.description}} |
75 | {{element.link}} |
76 |
77 | {% endfor %}
78 |
79 |
80 |
81 |
Blogs
82 |
83 |
84 |
85 |
86 | | Serial |
87 | Item ID |
88 | Name |
89 | Category |
90 | Description |
91 | Link |
92 |
93 |
94 |
95 | {% for element in blogs %}
96 |
97 | | {{loop.index}} |
98 | {{element._id}} |
99 | {{element.name}} |
100 | {{element.category}} |
101 | {{element.description}} |
102 | {{element.link}} |
103 |
104 | {% endfor %}
105 |
106 |
107 |
108 |
Newsletters
109 |
110 |
111 |
112 |
113 | | Serial |
114 | Item ID |
115 | Name |
116 | Category |
117 | Description |
118 | Link |
119 |
120 |
121 |
122 | {% for element in newsletters %}
123 |
124 | | {{loop.index}} |
125 | {{element._id}} |
126 | {{element.name}} |
127 | {{element.category}} |
128 | {{element.description}} |
129 | {{element.link}} |
130 |
131 | {% endfor %}
132 |
133 |
134 |
135 |
Startup Stories
136 |
137 |
138 |
139 |
140 | | Serial |
141 | Item ID |
142 | Name |
143 | Category |
144 | Description |
145 | Link |
146 |
147 |
148 |
149 | {% for element in startupStories %}
150 |
151 | | {{loop.index}} |
152 | {{element._id}} |
153 | {{element.name}} |
154 | {{element.category}} |
155 | {{element.description}} |
156 | {{element.link}} |
157 |
158 | {% endfor %}
159 |
160 |
161 |
162 |
Youtube Channels
163 |
164 |
165 |
166 |
167 | | Serial |
168 | Item ID |
169 | Name |
170 | Category |
171 | Description |
172 | Link |
173 |
174 |
175 |
176 | {% for element in youtubeChannels %}
177 |
178 | | {{loop.index}} |
179 | {{element._id}} |
180 | {{element.name}} |
181 | {{element.category}} |
182 | {{element.description}} |
183 | {{element.link}} |
184 |
185 | {% endfor %}
186 |
187 |
188 |
189 |
Podcasts
190 |
191 |
192 |
193 |
194 | | Serial |
195 | Item ID |
196 | Name |
197 | Category |
198 | Description |
199 | Link |
200 |
201 |
202 |
203 | {% for element in podcasts %}
204 |
205 | | {{loop.index}} |
206 | {{element._id}} |
207 | {{element.name}} |
208 | {{element.category}} |
209 | {{element.description}} |
210 | {{element.link}} |
211 |
212 | {% endfor %}
213 |
214 |
215 |
216 |
Tweets
217 |
218 |
219 |
220 |
221 | | Serial |
222 | Item ID |
223 | Name |
224 | Category |
225 | Description |
226 | Link |
227 |
228 |
229 |
230 | {% for element in tweets %}
231 |
232 | | {{loop.index}} |
233 | {{element._id}} |
234 | {{element.name}} |
235 | {{element.category}} |
236 | {{element.description}} |
237 | {{element.link}} |
238 |
239 | {% endfor %}
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
250 |
251 |
252 |
--------------------------------------------------------------------------------