To solve this optimization problem, we need to maximize the profit from selling peach and mango flavored drinks under the given constraints. Let's denote the number of mango drinks as \(M\) and the number of peach drinks as \(P\). The objective function to maximize is \(2M + 3P\), since the profit per mango drink is $2 and per peach drink is $3.

The constraints are:
1. Total drinks: \(M + P \leq 150\)
2. Minimum mango drinks: \(M \geq 60\)
3. Minimum peach drinks: \(P \geq 40\)
4. Maximum mango drinks: \(M \leq 120\)
5. Maximum peach drinks: \(P \leq 70\)

All variables are non-negative since the number of drinks cannot be negative.

Now, let's translate these constraints and the objective function into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Bubble_Tea_Optimization")

# Define variables
M = m.addVar(vtype=GRB.INTEGER, name="Mango_Drinks", lb=0)
P = m.addVar(vtype=GRB.INTEGER, name="Peach_Drinks", lb=0)

# Set the objective function to maximize profit
m.setObjective(2*M + 3*P, GRB.MAXIMIZE)

# Add constraints
m.addConstr(M + P <= 150, "Total_Drinks")
m.addConstr(M >= 60, "Minimum_Mango")
m.addConstr(P >= 40, "Minimum_Peach")
m.addConstr(M <= 120, "Maximum_Mango")
m.addConstr(P <= 70, "Maximum_Peach")

# Optimize the model
m.optimize()

# Print results if the model is optimal or feasible
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Mango Drinks: {M.x}")
    print(f"Peach Drinks: {P.x}")
    print(f"Maximum Profit: {m.objVal}")
elif m.status == GRB.INFEASIBLE:
    print("Model is infeasible")
else:
    print("No optimal solution found")

```