Finally, we arrive at the intelligent profiling bit. Now this part could obviously be hideously complex, but keep in mind the time constraints we have and the fact, of course, that you are not actually building the actual Netflix! For FakeFlix, we want you to really think about the different options. How could you suggest additional films to the user? Based on what? Yes, the films they have watched, but what specifically and how? Write some pseudocode and try and analyse it thoroughly before you start this part of the coding. It'll be really interesting to see what you come up with. We've kept it simple: Simply compare the viewed lists (for the user) with the films (all films). For each GENRE viewed in the user viewed list, look up the remaining films in the allfilms list...and display them as recommendations.
Testing the full solution is crucial. Make sure you test all parts of the program with all the relevant types of test data to ensure it really does work. You should have also kept a test log as you went along, keeping track of what worked, and what didn't and what you changed and solved along the way! This is also called a developmental log. It's important so that people know the work is your own!
There are many little niggles with the current solution. Not everything is as perfect as it could be. Here are a few things you could discuss (and add to your EVALUATION)
1. What could you improve about this solution?
2. What validation has been considered? Where could more validation be considered and added?
3. Are there other features, assuming you had more time, that you could add?
4. What do you think of the current file structure? What problems could arise? How could you improve it?
5. How do you think facebook stores their users and "likes" that multiple users make on multiple users profiles? Discuss this!
6. How could you further improve the login feature. What if an intruder was repeatedly trying to login as somebody else ...?
7. The intelligent profiling could be far more complex and clever. Discuss the different alternatives and possibilities for intelligent profiling. The sky's the limit really....
Note: See if you can do better (and you should be able to). The solutions provided are basic, and allow for discussion on possible alternative methods and solutions.
#Netflix type system demo - FakeFlix import csv import sys import string #for use in the secure password and other parts of the program def main(): menu() def menu(): print("************Welcome to FakeFlix Demo**************") print() choice = input(""" A: Please Register B: Login Q: Logout Please enter your choice: """) if choice == "A" or choice =="a": register() elif choice == "B" or choice =="b": login() elif choice=="Q" or choice=="q": sys.exit else: print("You must only select either A or B") print("Please try again") menu() def long_enough(pw): 'Password must be at least 6 characters' return len(pw) >= 6 def short_enough(pw): 'Password cannot be more than 12 characters' return len(pw) <= 12 def has_lowercase(pw): 'Password must contain a lowercase letter' return len(set(string.ascii_lowercase).intersection(pw)) > 0 def has_uppercase(pw): 'Password must contain an uppercase letter' return len(set(string.ascii_uppercase).intersection(pw)) > 0 def has_numeric(pw): 'Password must contain a digit' return len(set(string.digits).intersection(pw)) > 0 def has_special(pw): 'Password must contain a special character' return len(set(string.punctuation).intersection(pw)) > 0 def test_password(pw, tests=[long_enough, short_enough, has_lowercase, has_uppercase, has_numeric, has_special]): for test in tests: if not test(pw): print(test.__doc__) return False return True def register(): #user is prompted to input all the required fields print("Enter first name") global firstname firstname=input() print("Enter surname") global surname surname=input() print("Enter Date of Birth Format: dd/mm/yy") global dob dob=input() print("Enter first line of address") global firstlineaddress firstlineaddress=input() print("Enter Postcode") global postcode postcode=input() print("Enter Gender") global gender gender=input() print("Enter main genre of interest") global interest interest=input() print("Enter email address") global email email=input() substring=dob[-4:] #this sets the date of birth (last four characters that is the year) to substring print("Your unique username is", firstname+surname+substring) global username username=firstname+surname+substring #secure password checker passwordchecker(username) def passwordchecker(username): password=input("Please enter a password - must be secure and meet our format requirements") if test_password(password): #open the main registration text file with open('fakeflixfile.txt','a') as fakeflixfile: fakeflixfileWriter=csv.writer(fakeflixfile) #append the registration details to the text file fakeflixfileWriter.writerow([username,password,firstname,surname,dob,firstlineaddress,postcode,gender,interest,email]) print("Record has been written to file") #change the username to username.txt - we will use this to create a new unique user text file based on each user's username username = (username + ".txt") #CREATE a new FILE - it will be called the "username" (with the concatenated .txt at the end) file=open(username,'a') file.close() print("User File has been created") fakeflixfile.close() menu() else: passwordchecker(username) def login(): #set a variable (boolean type) to true if the user is NOT logged on notloggedin="true" #while the user is not logged on (i.e. while the login credentials provided do not work ...) while notloggedin=="true": print("***WELCOME - PLEASE LOGIN") #open the file we are reading from with open("fakeflixfile.txt",'r') as fakeflixfile: #prompt the user to enter their login details username=input("Enter username:-") password=input("Enter password:-") #call upon our reader (this allows us to work with our file) fakeflixfileReader=csv.reader(fakeflixfile) #for each row that is read by the Reader for row in fakeflixfileReader: for field in row: #search for the required matches in user entry against what is stored in the file if field==username and row[1]==password: print("Granted") displayfilms(username) notloggedin="false" global username #at this stage it becomes necessary to pass the username to the various subs, as we will need it to eventually generate and store viewings for each unique user. def displayfilms(username): print("*******************WELCOME to FAKEFLIX**************************") print("Welcome", username, ": ~What would you like to do?~") choice = input(""" W: Watch a film V: View your Recommendations T: Search by Title R: Search by Rating Q: Quit FakeFlix Please enter your choice: """) if choice == "W" or choice =="w": watchfilms(username) elif choice == "V" or choice =="v": recsmessage(username) elif choice=="T" or choice=="t": searchbytitle(username) elif choice=="R" or choice=="r": searchbyrating(username) elif choice=="Q" or choice=="q": sys.exit else: print("You must only select from the given options") print("Please try again") displayfilms(username) def viewrecs(username): #print("*******RECOMMENDATIONS FOR YOU*********") #print("Based on your previous viewing, we recommend ......") #set the username variable to the text file -to use it in the next bit username = (username + ".txt") #create a set that contains genre and name (lookup) genre_name_lookup_set = set() #create a set that only looks up the genre (this is in the username file) genre_lookup_set = set() #open the username file that stores the latest viewings of the respective user with open(username,"r") as f: #open the csv file reader for the username file fReader=csv.reader(f) #for each row in the fReader for row in fReader: genre = row[1] name = row[2] #add values to the respective sets genre_name_lookup_set.add('%s-%s' % (genre, name)) genre_lookup_set.add(genre) with open("films.txt","r") as films: filmsReader=csv.reader(films) #for each row in the films file for row in filmsReader: genre = row[1] name = row[2] lookup_key = '%s-%s' % (genre, name) #the lookup key provides ALL the data (genre, name) in the films file #if the look up key (all data in films file) is NOT in the username file and the genre in the films file is not in the genres_lookupset for the usernames, then PRINT ROWs that are left! if lookup_key not in genre_name_lookup_set and genre in genre_lookup_set: print(row) print("~What would you like to do?~") choice = input(""" F: Return to the FakeFlix Menu Q: Quit FakeFlix Please enter your choice: """) if choice == "F" or choice =="f": displayfilms(username) elif choice == "Q" or choice =="q": sys.exit def recsmessage(username): print("*******RECOMMENDATIONS FOR YOU*********") print("Based on your previous viewing, we recommend ......") viewrecs(username) def searchbytitle(username): #open the file with open("films.txt","r") as f: #prompt the user to enter the desired title that they are searching for title=input("Enter Title of film:") #call up on the csv reader (this will allow us to work with the file and do clever stuff!) fReader=csv.reader(f) #for reach row that is read by the reader for row in fReader: #and for each field in that row (this feature is automated by the reader) for field in row: #if the field is equal to the title that you are looking for if title in field: #this looks for title or any part of title in the field (not necessarily a perfect solution) print("Searching file ....please wait") print("Found:", row) print("This is film no:", row[0]) choice=input("""Would you like to view this film? Y: Yes N: No, thanks Please enter your choice:""") if choice=="Y" or choice=="y": viewfilmfunction(row[0],username) elif choice=="N" or choice=="n": displayfilms(username) def searchbyrating(username): #open the file with open("films.txt","r") as f: #prompt the user to enter the desired title that they are searching for rating=input("Enter the RATING you are after *and we'll show you films that match*:") #call up on the csv reader (this will allow us to work with the file and do clever stuff!) fReader=csv.reader(f) #for reach row that is read by the reader for row in fReader: #and for each field in that row (this feature is automated by the reader) for field in row: #if the field is equal to the rating that you are looking for if rating in field: #this looks for title or any part of title in the field (not necessarily a perfect solution) print("Searching file ....please wait") print("Found:", row) print("This is film no:", row[0]) choice=input("""Would you like to view any of these films? Y: Yes N: No, thanks Please enter your choice:""") if choice=="Y" or choice=="y": print("We are taking you to the WATCH FILMS menu - ratings are displayed next to films") watchfilms(username) elif choice=="N" or choice=="n": displayfilms(username) def watchfilms(username): #Open the file for reading filmsfile=open("films.txt","r", encoding="utf8") #Create a list called displayfilms into which all the file lines are read into.... displayfilmslist=filmsfile.read() #print the list (that now has the film details in it) print(displayfilmslist) filmsfile.close() print("~What would you like to do?~") choice = input(""" Select a number to View a Film! or F: Return to the FakeFlix Menu Q: Quit FakeFlix Please enter your choice: """) if choice == "F" or choice =="f": displayfilms(username) elif choice == "Q" or choice =="q": sys.exit elif choice=="1": viewfilmfunction(1,username) elif choice=="2": viewfilmfunction(2,username) elif choice=="3": viewfilmfunction(3,username) elif choice=="4": viewfilmfunction(4,username) elif choice=="5": viewfilmfunction(5,username) elif choice=="6": viewfilmfunction(6,username) elif choice=="7": viewfilmfunction(7,username) elif choice=="8": viewfilmfunction(8,username) elif choice=="9": viewfilmfunction(9,username) else: print("You must only select from the given options") print("Please try again") displayfilms() def viewfilmfunction(x,username): #open the file as student file (variable) print(username, ":You are about to view Film:", x, "Enter the selection ID number of the film again to confirm viewing") with open("films.txt","r") as filmsfile: #prompt the user to enter the ID number they require idnumber=input("Enter the ID number you require:") #call upon our reader (this allows us to work with our file) filmsfileReader=csv.reader(filmsfile) #for each row that is read by the Reader for row in filmsfileReader: #and for each field in that row (this does it automatically for us) for field in row: #if the field is equal to the id number that is being searched for if field ==idnumber: #print the row fields (genre and title) corresponding to that ID number #create a list which contains the relevant fields in the row. viewedlist=[row[0],row[1],row[2],row[3]] print("You have viewed:", viewedlist) with open("fakeflixfile.txt","r")as membersfile: #Open Reader membersfileReader=csv.reader(membersfile) for row in membersfileReader: for field in row: if field==username: #Open Writer to append to file -this time it looks for the file stored by that username with open("%s.txt" % username,"a", newline="") as membersfile: membersfileWriter=csv.writer(membersfile) #Use the writer to append the viewedlist to the appropriate member's user file. membersfileWriter.writerow(viewedlist) print("Your Recent viewing has been stored") print("~Like this film?~") choice = input(""" ***PRESS L TO LIKE!*** or V: Watch more Films F: Return to the FakeFlix Menu Q: Quit FakeFlix Please enter your choice: """) if choice == "F" or choice =="f": displayfilms(username) if choice == "V" or choice =="v": watchfilms(username) elif choice == "Q" or choice =="q": sys.exit elif choice=="L" or choice=="l": user_like_film(username) else: print("You must only select from the given options") print("Please try again") import csv films_file = "films.txt" def likeafilm(x): #open the films file for reading with open(films_file,mode="r") as f: reader = csv.reader(f) #create a list to read in the file (called records) -read in all the rows in the reader records = [row for row in reader] #and for every record in the list (we are now working with the list not the file) for rec in records: #print("print rec:", rec) TEST IF NEEDED: This prints all records #print("print rec[0]", rec[0]) TEST: this prints the index number for all records, e.g. 0,1,2,3 etc #print("print rec[-1]", rec[-1]) TEST: this prints the content of likes (-1 because it is the last one from the end) so 0,0,0, or 3(if the likes are 3) #if the index of any of the records is equal to the index number we are searcin for if int(rec[0]) ==x: #increment that particular field (in the list by 1) rec[-1] = str(int(rec[-1]) + 1) #open the file for reading, ensure there is a newline inserted on opening to strip any blank spaces or eliminate them so they are not written to the file with open("films.txt","w", newline="") as f: #write the file (overwrite) writer=csv.writer(f) #write the new records to the file writer.writerows(records) print("Your like for Film no:", x, "has been stored - Thanks!") def user_like_film(username): x = int(input("Enter the ID of the film you wish to like: ")) likeafilm(x) print("WANT TO WATCH ANOTHER FILM?") watchfilms(username) main()
Did you make a list of objectives and success criteria when you started this task? Tick them off and write a sentence next to each explaining how you did/or did not solve it
Write your own summary of the problem. What are your objectives? List the success criteria
Test No. | Description | Test Data(input) | Expected Outcome | Actual Outcome | Further Action? |
---|---|---|---|---|---|
1 | |||||
2 | |||||
3 | |||||
4 | |||||
5 |