To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of dolls and soldiers to be made, formulating the objective function that represents the total profit, and listing the constraints based on the available time for crafting and sanding.

Let's define:
- \(x_1\) as the number of dolls to be made,
- \(x_2\) as the number of soldiers to be made.

The objective function, which is to maximize the total profit, can be represented as:
\[8x_1 + 10x_2\]

Given that each doll takes 10 minutes of crafting and each soldier takes 15 minutes, with a total of 1000 minutes available for crafting, we have the constraint:
\[10x_1 + 15x_2 \leq 1000\]

For sanding, with each doll requiring 5 minutes and each soldier requiring 8 minutes, and a total of 800 minutes available, we have:
\[5x_1 + 8x_2 \leq 800\]

Additionally, \(x_1\) and \(x_2\) must be non-negative since they represent quantities of items.

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of dolls'), ('x2', 'number of soldiers')],
    'objective_function': '8*x1 + 10*x2',
    'constraints': ['10*x1 + 15*x2 <= 1000', '5*x1 + 8*x2 <= 800', 'x1 >= 0', 'x2 >= 0']
}
```

To solve this problem using Gurobi in Python, we will use the following code:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="dolls")
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="soldiers")

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

# Add constraints
m.addConstr(10*x1 + 15*x2 <= 1000, "crafting_time")
m.addConstr(5*x1 + 8*x2 <= 800, "sanding_time")
m.addConstr(x1 >= 0, "non_negative_dolls")
m.addConstr(x2 >= 0, "non_negative_soldiers")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of dolls: {x1.x}")
    print(f"Number of soldiers: {x2.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```