To solve this optimization problem, we need to define the decision variables, the objective function, and the constraints. Let's denote:

- $T$ as the number of tables produced per day.
- $C$ as the number of chairs produced per day.

The objective is to maximize profit. The profit from each table is $1000, and from each chair is $300. So, the total profit $P$ can be represented as:
\[ P = 1000T + 300C \]

There are constraints based on the hours available for crafting and polishing:

1. Crafting constraint: Each table requires 5 hours of crafting, and each chair requires 2 hours. The maximum crafting hours available per day is 25.
\[ 5T + 2C \leq 25 \]

2. Polishing constraint: Each table requires 2 hours of polishing, and each chair requires 1 hour. The maximum polishing hours available per day is 15.
\[ 2T + C \leq 15 \]

Additionally, $T$ and $C$ must be non-negative since they represent the number of tables and chairs.

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

```python
from gurobipy import *

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

# Define variables
T = m.addVar(lb=0, vtype=GRB.INTEGER, name="Tables")
C = m.addVar(lb=0, vtype=GRB.INTEGER, name="Chairs")

# Set the objective function: Maximize profit
m.setObjective(1000*T + 300*C, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5*T + 2*C <= 25, "Crafting_Hours")
m.addConstr(2*T + C <= 15, "Polishing_Hours")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Tables to produce: {T.x}")
    print(f"Chairs to produce: {C.x}")
    print(f"Maximum Profit: ${m.objVal}")
else:
    print("No optimal solution found.")
```