How to update a doc's attribute on MongoDB Atlas?

30 Views Asked by At

I am using MongoDB Atlas Shared Clusters (free ones), and I'd like to update a point attribute of Users whenever the referral code of that user is used. Here is the full code, the problem is in "increase_points" function, because I can add new users. The interesting part is, in "submit()", we can use "existing_user = User.objects(email=email).first()" however, I can not search with it in "increase_point" function. I wrote 2 txt file creation code since I was not sure about logs, so want to see. However, it does nto create those txt files.

Thanks in advance.

from flask import Flask, request, redirect, url_for, flash, render_template
from flask_mongoengine import MongoEngine
import os
import string
import random
from datetime import datetime

import logging

logging.basicConfig(level=logging.DEBUG)

app = Flask(__name__)

app.config['MONGODB_SETTINGS'] = {
    'db': 'kanzy-db',
    'host': 'mongodb+srv://hhuseyinsenoll:[email protected]/kanzy-db?retryWrites=true&w=majority',
    'username': 'hhuseyinsenoll',
    'password': 'kanzydb11',
    'authentication_source': 'admin'  # Assuming admin is your auth source
}

app.config['SECRET_KEY'] = 'your_secret_key'  # Add a real secret key
# Initialize MongoDB
db = MongoEngine(app)

# Define the User Model
class User(db.Document):
    email = db.StringField(required=True, unique=True)
    referral_code = db.StringField(required=True, unique=True)
    points = db.IntField(default=0)
    date_created = db.DateTimeField(required=True)

def generate_referral_code():
    return ''.join(random.choices(string.ascii_letters + string.digits, k=8))

@app.route('/', methods=['GET'])
def home():
    return app.send_static_file('index.html')


@app.route('/success/<referral_code>', methods=['GET'])
def success(referral_code):
    return render_template('success.html', referral_code=referral_code)

    
def increase_points(referral_code, points_to_add):
    logging.debug(f"Attempting to increase points for referral_code: {referral_code}")
    user = User.objects(referral_code=referral_code).first()
    with open('readme1.txt', 'w') as f:
            f.write('Create a new text file!')
    if user:
        new_points = user.points + points_to_add
      
        with open('readme2.txt', 'w') as f:
            f.write('Create a new text file!')
        print("Hello World!")
        db.user.update_one({"referral_code": referral_code},
                        {"$set": {"points": new_points}})
        logging.debug(f"Update completed.")
    else:
        logging.debug(f"No user found with referral_code: {referral_code}")





@app.route('/submit', methods=['POST'])
def submit():
    if request.method == 'POST':
        email = request.form['email']
        referral_code_used = request.form.get('referral_code')
        
        existing_user = User.objects(email=email).first()
        
        if existing_user:
            flash('Email already registered.')
            return redirect(url_for('home'))
        
       
        if referral_code_used:
            logging.debug(f"Referral code used during registration: {referral_code_used}")
            increase_points(referral_code_used, points_to_add=1)
        
        new_user = User(
            email=email,
            referral_code=generate_referral_code(),
            date_created=datetime.utcnow()
        )


        new_user.save()
        flash('Successfully registered!')
        return redirect(url_for('success', referral_code=new_user.referral_code))
   


@app.route('/users', methods=['GET'])
def users_list():
    users = User.objects()  # Retrieve all users from MongoDB
    users_data = "<h1>All Users</h1><ul>"
    for user in users:
        users_data += f"<li>{user.email} - Points: {user.points} - Referral Code: {user.referral_code}</li>"
    users_data += "</ul>"
    return users_data

if __name__ == "__main__":
    app.run(debug=True)

0

There are 0 best solutions below