From 7e519a9fa895e4ab734dece436b9868ec8f8de70 Mon Sep 17 00:00:00 2001 From: Joel Oksanen <joel.oksanen17@imperial.ac.uk> Date: Thu, 27 Feb 2020 12:48:17 +0000 Subject: [PATCH] Implemented DataLoader class. Added star rating to app --- ADA/DataLoader.py | 15 ++++ ADA/item.py | 3 +- ADA/server/ios_server/urls.py | 2 + ADA/server/ios_server/views.py | 28 +++++- ADAbot/ADAbot.xcodeproj/project.pbxproj | 4 + .../UserInterfaceState.xcuserstate | Bin 49331 -> 51315 bytes .../star_border.imageset/Contents.json | 21 +++++ .../star_border.imageset/star_border.png | Bin 0 -> 2223 bytes .../star_fill.imageset/Contents.json | 21 +++++ .../star_fill.imageset/star_fill.png | Bin 0 -> 1290 bytes ADAbot/ADAbot/Chat/ChatManager.swift | 1 + ADAbot/ADAbot/ConnectionManager.swift | 47 +++++++++- ADAbot/ADAbot/Product/Product.swift | 10 +-- ADAbot/ADAbot/Product/ProductInfo.swift | 12 +-- ADAbot/ADAbot/Product/ProductView.swift | 9 +- ADAbot/ADAbot/Product/RatingView.swift | 81 ++++++++++++++++++ 16 files changed, 230 insertions(+), 24 deletions(-) create mode 100644 ADA/DataLoader.py create mode 100644 ADAbot/ADAbot/Assets.xcassets/star_border.imageset/Contents.json create mode 100644 ADAbot/ADAbot/Assets.xcassets/star_border.imageset/star_border.png create mode 100644 ADAbot/ADAbot/Assets.xcassets/star_fill.imageset/Contents.json create mode 100644 ADAbot/ADAbot/Assets.xcassets/star_fill.imageset/star_fill.png create mode 100644 ADAbot/ADAbot/Product/RatingView.swift diff --git a/ADA/DataLoader.py b/ADA/DataLoader.py new file mode 100644 index 0000000..f0bccef --- /dev/null +++ b/ADA/DataLoader.py @@ -0,0 +1,15 @@ +import pandas as pd + +class DataLoader: + + data_location = 'amazon_reviews_us_Camera_v1_00.tsv' + reviews = pd.read_csv(data_location, sep='\t', error_bad_lines=False) + + def get_reviews(self, product_id): + return self.reviews[self.reviews['product_id'] == product_id].reset_index(drop=True) + + def get_product_name(self, product_id): + return self.get_reviews(product_id)['product_title'][0] + + def get_avg_star_rating(self, product_id): + return self.get_reviews(product_id)['star_rating'].mean() diff --git a/ADA/item.py b/ADA/item.py index cb35af4..8626442 100644 --- a/ADA/item.py +++ b/ADA/item.py @@ -23,6 +23,5 @@ battery: ['battery'], flash: ['flash'], audio: ['audio', 'sound'], price: ['price', 'value', 'cost'], -shipping: ['ship'], - +shipping: ['ship'] } diff --git a/ADA/server/ios_server/urls.py b/ADA/server/ios_server/urls.py index 88a9cac..cc73da3 100644 --- a/ADA/server/ios_server/urls.py +++ b/ADA/server/ios_server/urls.py @@ -4,4 +4,6 @@ from . import views urlpatterns = [ path('', views.index, name='index'), + path('product/', views.product, name='product'), + path('message/', views.message, name='message') ] diff --git a/ADA/server/ios_server/views.py b/ADA/server/ios_server/views.py index ab9cb8a..a3e3428 100644 --- a/ADA/server/ios_server/views.py +++ b/ADA/server/ios_server/views.py @@ -1,8 +1,28 @@ -from django.http import JsonResponse +from django.http import JsonResponse, HttpResponse +import json +from django.views.decorators.csrf import csrf_exempt + +import sys +sys.path.append('/Users/joeloksanen/individual_project/ADA') +from DataLoader import DataLoader + +dl = DataLoader() def index(request): + return HttpResponse("OK") + +def product(request): id = request.GET.get('id', '') - name = 'Joel' - price = 1.2 + name = dl.get_product_name(id) + star_rating = dl.get_avg_star_rating(id) imageURL = 'https://ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=US&ASIN=' + id + '&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=SL250' - return JsonResponse({'id': id, 'name': name, 'price': price, 'imageURL': imageURL}) + return JsonResponse({'id': id, 'name': name, 'starRating': star_rating, 'imageURL': imageURL}) + +@csrf_exempt +def message(request): + parsed = json.loads(request.body) + arg_id = parsed['argumentID'] + query_id = parsed['queryID'] + print(arg_id) + print(query_id) + return HttpResponse("OK") diff --git a/ADAbot/ADAbot.xcodeproj/project.pbxproj b/ADAbot/ADAbot.xcodeproj/project.pbxproj index 595bcb4..2dcdfbc 100644 --- a/ADAbot/ADAbot.xcodeproj/project.pbxproj +++ b/ADAbot/ADAbot.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ 9449FE4D2404561400025F70 /* ArgumentQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE4C2404561400025F70 /* ArgumentQuery.swift */; }; 9449FE4F240533FD00025F70 /* QueryOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE4E240533FD00025F70 /* QueryOptionView.swift */; }; 9449FE5124053DA500025F70 /* ChatManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE5024053DA500025F70 /* ChatManager.swift */; }; + 94BE1EEB2407E26900741749 /* RatingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94BE1EEA2407E26900741749 /* RatingView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -56,6 +57,7 @@ 9449FE4C2404561400025F70 /* ArgumentQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArgumentQuery.swift; sourceTree = "<group>"; }; 9449FE4E240533FD00025F70 /* QueryOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryOptionView.swift; sourceTree = "<group>"; }; 9449FE5024053DA500025F70 /* ChatManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatManager.swift; sourceTree = "<group>"; }; + 94BE1EEA2407E26900741749 /* RatingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingView.swift; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -136,6 +138,7 @@ 9449FE2E2402C8C500025F70 /* ProductView.swift */, 9449FE322402CBD400025F70 /* ProductInfo.swift */, 9449FE362402D29E00025F70 /* Product.swift */, + 94BE1EEA2407E26900741749 /* RatingView.swift */, ); path = Product; sourceTree = "<group>"; @@ -229,6 +232,7 @@ 9449FE352402CCDA00025F70 /* ConnectionManager.swift in Sources */, 9449FE1D2402C84F00025F70 /* SceneDelegate.swift in Sources */, 9449FE1F2402C84F00025F70 /* ContentView.swift in Sources */, + 94BE1EEB2407E26900741749 /* RatingView.swift in Sources */, 9449FE332402CBD400025F70 /* ProductInfo.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ADAbot/ADAbot.xcodeproj/project.xcworkspace/xcuserdata/joeloksanen.xcuserdatad/UserInterfaceState.xcuserstate b/ADAbot/ADAbot.xcodeproj/project.xcworkspace/xcuserdata/joeloksanen.xcuserdatad/UserInterfaceState.xcuserstate index aba7d1fbd42498ccc6a697fe308f25495375485f..043cb29f8358189a57e24181a735f697eed295e9 100644 GIT binary patch delta 23870 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 delta 22865 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 U{e4MEv!;#z|9}5T{#)1dA07yQ#sB~S diff --git a/ADAbot/ADAbot/Assets.xcassets/star_border.imageset/Contents.json b/ADAbot/ADAbot/Assets.xcassets/star_border.imageset/Contents.json new file mode 100644 index 0000000..55c9bcf --- /dev/null +++ b/ADAbot/ADAbot/Assets.xcassets/star_border.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "star_border.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ADAbot/ADAbot/Assets.xcassets/star_border.imageset/star_border.png b/ADAbot/ADAbot/Assets.xcassets/star_border.imageset/star_border.png new file mode 100644 index 0000000000000000000000000000000000000000..39028c7ddc67780b2c866bdc0c6ae67ffd6a1607 GIT binary patch literal 2223 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 literal 0 HcmV?d00001 diff --git a/ADAbot/ADAbot/Assets.xcassets/star_fill.imageset/Contents.json b/ADAbot/ADAbot/Assets.xcassets/star_fill.imageset/Contents.json new file mode 100644 index 0000000..8829f5d --- /dev/null +++ b/ADAbot/ADAbot/Assets.xcassets/star_fill.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "star_fill.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ADAbot/ADAbot/Assets.xcassets/star_fill.imageset/star_fill.png b/ADAbot/ADAbot/Assets.xcassets/star_fill.imageset/star_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..dff8afbfbace2c0b94bb8d569fac1c1b033fae98 GIT binary patch literal 1290 zcmV+l1@-!gP)<h;3K|Lk000e1NJLTq003?P003?X1^@s6##<))000EhNkl<Zc%1E> zPiRzE6vlrsX~3$jHA=fEA;MHct*Z)d1gWdE(zFX*xoLM5+!Xp})rC8kf(yl^;KoG> zt^~nF!B!zsL6DNho$1C@lU77*G+o^L$V@WM%$s-bIrrT;KR6_iWbSv)m+!vEo0&IY z7=~dOhG7_nVbqCXZ2=Ma0@w}AYYQ>Tam$xcBc^~=UsK9jj1t^p%{WV4O=wP=rLIOa zr_EAV6WXQCQda}orOi^8IGxgFsY{qnX|vQNN-t@%)FntSX|vQNMwzr(>Jp+%+AMX6 z&`;VdbqUZ<+AMX-R7snqPLV2Uv(zaOB5jsB1wy3FQYTEvv{~u|37Ixaoe(k7W~mb( zM%pZOk%^f$OI<`_rp;0p35m2>>LMVKHcMS#B-3W83y5UeEOmjHM&7idrUm-zn;~rh zz!)$IG<<#Fs{y>Fs0-j9+}pJN^fmA658!V_U1G+K(P~Ho*yF!$7t#=#C7g+KtQlGu z9NpBA#=XOuA$!QfoPJqv>Ri+JPeLqE*0^SK)^BY)LI@fF9<y=lEp6)SjQg0@t*uCr znG=`Cw5GE#_)f16@I88Gb5^bOT^Fx5a54eWgI*`Qy7U^p23{u6z@XJjKl@6Yz|502 z?L<$`^uRRmB7vrIuNOqPV)HrhEP>{7t!IA5Q8<E`7t6FGC4A_ML%_0fqdC>GpQ#83 zahG+po348;`B{pxA9z$z_#oFKKSLGv0}EXQT5YTa6iq8=01we0MqTQmpIH)2;4X@4 z4<+@Q_p?fh_i<OXwTF{x&G{K6$u8g?`a?>s?)ljy%`RXT{b8k2v(&(}g13R&=nqZ1 zZu?o(ifzCR^oOTaH~b80$(z7+^oJ;2*M0A`W)!%J{xGHLs_!`qMu98n4>fjOAtTcY zhJnlI4>wj_CgTs_7zWOxKjhGLo{UW^7y{0rKkQI-jx^qbA;JXu0}oXbK_}BAn=}?B zfu}SAqSA|&aUUtI8v~VI%(&_dlySCIRz%}$Xax6iv^Nyij=_Jp%Udgwi)tipFZq}T zu9v;ii)t8`)A6l9yeBg*3<F_YPA4V>;ysyhVG!?0`mAyb@UOzUu~`MS;?9;ukWSo( z<YyYVp7u#DC~aJhCng1=y-6FF<MFLPv^O&@99bJ@TV)_5PZY+0MZxtn*on|x^&}G~ zxt071eB$dj!F97d6r3Xd%Lsl4K5eu1XZ~lg*FRNhLWy#Lcmul+9HaBrKjeSsencG? z`kYPD+$8*<9splaZp+`~|K>piJvU3}s0|@+v9SPrL$y~8kNU^>E1<6B3VM=coG^n~ z1il3}2h_INKjvZ}jpG5esdJQS!&m}-!d=LX#a6#Y)%&*`ji^zaAL(xhPk}SY-qU%z zU-N07ntu?~8l6j&YyLTK7I;@ftmi$i;W_2BU(yg8i@WsJ^a^m1w2l+wI87_`*27&L znc*3s`+w~#+}o6rxp7My8aR!w=)PNwC}|AJB%K?b!9BrR7xv*acj{?UO<h2a)4sWD zzyU>FRXKp`p<Qps6?FyUG_6hj0vuLV6qdudo|=0+t*R&xKjWI2CGXE=o5Fpt!z!-l z+A{-uNuDnfTF(%!*BNaghG7_nVHk#C7)DzB4;bdyr_J-;RsaA107*qoM6N<$g7g_+ A2mk;8 literal 0 HcmV?d00001 diff --git a/ADAbot/ADAbot/Chat/ChatManager.swift b/ADAbot/ADAbot/Chat/ChatManager.swift index e9ffe56..ddd13a9 100644 --- a/ADAbot/ADAbot/Chat/ChatManager.swift +++ b/ADAbot/ADAbot/Chat/ChatManager.swift @@ -19,6 +19,7 @@ class ChatManager: ObservableObject { } func sendQuery(query: ArgumentQuery) { + connectionManager.sendQuery(query) sent = true DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { self.sent = false diff --git a/ADAbot/ADAbot/ConnectionManager.swift b/ADAbot/ADAbot/ConnectionManager.swift index 7b60563..0bbc1e3 100644 --- a/ADAbot/ADAbot/ConnectionManager.swift +++ b/ADAbot/ADAbot/ConnectionManager.swift @@ -17,8 +17,8 @@ class ConnectionManager: ObservableObject { requestProduct(id: "B00RTGK0N0") } - func requestProduct(id: String) { - let url = URL(string: "http://192.168.0.13:8000/ios_server/?id=" + id)! + private func requestProduct(id: String) { + let url = URL(string: "http://192.168.0.13:8000/ios_server/product/?id=" + id)! let task = URLSession.shared.dataTask(with: url) {(data, response, error) in guard let data = data else { return } @@ -27,7 +27,8 @@ class ConnectionManager: ObservableObject { DispatchQueue.main.async { self.requestImage(at: productInfo.imageURL) self.product.name = productInfo.name - self.product.price = productInfo.price + self.product.starRating = productInfo.starRating + print(productInfo.starRating) } } catch let parseError { print(parseError) @@ -39,7 +40,7 @@ class ConnectionManager: ObservableObject { task.resume() } - func requestImage(at urlString: String) { + private func requestImage(at urlString: String) { let url = URL(string: urlString)! let task = URLSession.shared.dataTask(with: url) {(data, response, error) in @@ -53,8 +54,46 @@ class ConnectionManager: ObservableObject { task.resume() } + func sendQuery(_ query: ArgumentQuery) { + let url = URL(string: "http://192.168.0.13:8000/ios_server/message/")! + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + guard let data = try? JSONEncoder().encode(query) else { + return + } + + let task = URLSession.shared.uploadTask(with: request, from: data) { receivedData, response, error in + if let error = error { + self.handleClientError(error: error) + return + } + guard let httpResponse = response as? HTTPURLResponse, + (200...299).contains(httpResponse.statusCode) else { + self.handleServerError(response: response!) + return + } + if let mimeType = httpResponse.mimeType, + mimeType == "text/html", + let receivedData = receivedData { + DispatchQueue.main.async { + print(receivedData) + } + } + } + task.resume() + } + func addMessage(message: Message) { messages.append(message) } + private func handleClientError(error: Error) { + print("Client error occurred") + } + private func handleServerError(response: URLResponse) { + print("Server error occurred") + } + } diff --git a/ADAbot/ADAbot/Product/Product.swift b/ADAbot/ADAbot/Product/Product.swift index 6502087..88e1460 100644 --- a/ADAbot/ADAbot/Product/Product.swift +++ b/ADAbot/ADAbot/Product/Product.swift @@ -10,14 +10,14 @@ import UIKit struct Product { + var name: String + var starRating: Double + var image: UIImage + init() { self.name = "" - self.price = 0 + self.starRating = 0 self.image = UIImage() } - var name: String - var price: Double - var image: UIImage - } diff --git a/ADAbot/ADAbot/Product/ProductInfo.swift b/ADAbot/ADAbot/Product/ProductInfo.swift index 4126f74..7d19d17 100644 --- a/ADAbot/ADAbot/Product/ProductInfo.swift +++ b/ADAbot/ADAbot/Product/ProductInfo.swift @@ -8,16 +8,16 @@ struct ProductInfo: Decodable { + let id: String + let name: String + let starRating: Double + let imageURL: String + init() { self.id = "" self.name = "" - self.price = 0 + self.starRating = 0 self.imageURL = "" } - let id: String - let name: String - let price: Double - let imageURL: String - } diff --git a/ADAbot/ADAbot/Product/ProductView.swift b/ADAbot/ADAbot/Product/ProductView.swift index 09eff76..efaf649 100644 --- a/ADAbot/ADAbot/Product/ProductView.swift +++ b/ADAbot/ADAbot/Product/ProductView.swift @@ -22,9 +22,12 @@ struct ProductView: View { VStack { Spacer() HStack(alignment: .top) { - Text(connectionManager.product.name) - .font(Font.custom("Helvetica Neue", size: 14)) - .foregroundColor(Color.gray) + VStack { + Text(connectionManager.product.name) + .font(Font.custom("Helvetica Neue", size: 14)) + .foregroundColor(Color.gray) + RatingView(starRating: $connectionManager.product.starRating) + } Spacer() Image(uiImage: connectionManager.product.image) .resizable() diff --git a/ADAbot/ADAbot/Product/RatingView.swift b/ADAbot/ADAbot/Product/RatingView.swift new file mode 100644 index 0000000..517dad4 --- /dev/null +++ b/ADAbot/ADAbot/Product/RatingView.swift @@ -0,0 +1,81 @@ +// +// StarView.swift +// ADAbot +// +// Created by Joel Oksanen on 27.2.2020. +// Copyright © 2020 Joel Oksanen. All rights reserved. +// + +import SwiftUI + +struct RatingView: View { + let dim: CGFloat = 16 + @Binding var starRating: Double + var fullStars: Int { + get { + return Int(starRating.rounded(.down)) + } + } + var starFrac: CGFloat { + get { + let frac = CGFloat(starRating - starRating.rounded(.down)) + return frac >= 0.25 ? (frac <= 0.75 ? frac : 0.75) : 0.25 + } + } + var emptyStars: Int { + get { + let n = 4 - fullStars + return n > 0 ? n : 0 + } + } + + var body: some View { + HStack(spacing: 3) { + ForEach(0..<fullStars, id: \.self) { i in + ZStack { + Image("star_fill") + .renderingMode(.template) + .resizable() + .aspectRatio(contentMode: .fill) + .foregroundColor(Color(red: 254/255, green: 200/255, blue: 0/255)) + Image("star_border") + .renderingMode(.template) + .resizable() + .aspectRatio(contentMode: .fill) + .foregroundColor(Color(red: 176/255, green: 131/255, blue: 58/255)) + } + .frame(width: self.dim, height: self.dim) + } + + if starFrac != 0 { + ZStack(alignment: .leading) { + Image("star_fill") + .renderingMode(.template) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: self.dim * starFrac, height: self.dim, alignment: .leading) + .foregroundColor(Color(red: 254/255, green: 200/255, blue: 0/255)) + .clipped() + Image("star_border") + .renderingMode(.template) + .resizable() + .aspectRatio(contentMode: .fill) + .foregroundColor(Color(red: 176/255, green: 131/255, blue: 58/255)) + .frame(width: self.dim, height: self.dim) + } + } + + ForEach(0..<emptyStars, id: \.self) { i in + Image("star_border") + .renderingMode(.template) + .resizable() + .aspectRatio(contentMode: .fill) + .foregroundColor(Color(red: 176/255, green: 131/255, blue: 58/255)) + .frame(width: self.dim, height: self.dim) + } + + Spacer() + } + } +} + -- GitLab