To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of dolls as \(D\) and the number of soldiers as \(S\). The profit per doll is $8, and the profit per soldier is $10. Thus, our objective function to maximize profit (\(P\)) can be written as:

\[ P = 8D + 10S \]

The constraints are based on the available time for crafting and sanding. Each doll takes 10 minutes of crafting and 5 minutes of sanding, while each soldier takes 15 minutes of crafting and 8 minutes of sanding. The shop has 1000 minutes available for crafting and 800 minutes for sanding. Therefore, our constraints can be expressed as:

1. Crafting time constraint: \(10D + 15S \leq 1000\)
2. Sanding time constraint: \(5D + 8S \leq 800\)

Additionally, we have non-negativity constraints since the number of dolls and soldiers cannot be negative:

\[ D \geq 0, S \geq 0 \]

Given these equations, we can now formulate this problem in Gurobi using Python.

```python
from gurobipy import *

# Create a model
m = Model("Wooden_Toys")

# Define decision variables
D = m.addVar(vtype=GRB.CONTINUOUS, name="dolls", lb=0)
S = m.addVar(vtype=GRB.CONTINUOUS, name="soldiers", lb=0)

# Objective function: Maximize profit
m.setObjective(8*D + 10*S, GRB.MAXIMIZE)

# Constraints
m.addConstr(10*D + 15*S <= 1000, "crafting_time")
m.addConstr(5*D + 8*S <= 800, "sanding_time")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Dolls: {D.x}")
    print(f"Soldiers: {S.x}")
    print(f"Maximum Profit: ${8*D.x + 10*S.x:.2f}")
else:
    print("No optimal solution found")
```