To solve the given optimization problem, we first need to define the decision variables, objective function, and constraints based on the natural language description provided.

Let's denote:
- \(x_1\) as the number of bookcases produced in a week.
- \(x_2\) as the number of coffee tables produced in a week.

The objective is to maximize profit. Given that the profit on a bookcase is $90 and on a coffee table is $65, the objective function can be written as:
\[ \text{Maximize:} \quad 90x_1 + 65x_2 \]

Now, let's formulate the constraints based on the given information:

1. **Production Capacity Constraints**:
   - A maximum of 40 bookcases can be made in a week: \( x_1 \leq 40 \)
   - A maximum of 60 coffee tables can be made in a week: \( x_2 \leq 60 \)

2. **Time Constraint**:
   - It takes 7 hours to make a bookcase and 5 hours to make a coffee table, with a total of at most 150 hours available per week for all employees: \( 7x_1 + 5x_2 \leq 150 \)

3. **Non-Negativity Constraints**:
   - The number of bookcases and coffee tables produced cannot be negative: \( x_1 \geq 0, x_2 \geq 0 \)

With these definitions, the linear programming (LP) problem can be formulated as follows:

\[ \text{Maximize:} \quad 90x_1 + 65x_2 \]
\[ \text{Subject to:} \]
\[ x_1 \leq 40 \]
\[ x_2 \leq 60 \]
\[ 7x_1 + 5x_2 \leq 150 \]
\[ x_1, x_2 \geq 0 \]

Now, let's translate this LP problem into Gurobi code in Python:

```python
from gurobipy import *

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

# Define the decision variables
x1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Bookcases")
x2 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Coffee_Tables")

# Set the objective function
m.setObjective(90*x1 + 65*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 <= 40, "Max_Bookcases")
m.addConstr(x2 <= 60, "Max_Coffee_Tables")
m.addConstr(7*x1 + 5*x2 <= 150, "Total_Hours")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Bookcases: {x1.x}")
    print(f"Coffee Tables: {x2.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```