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 interest (laptop bags and briefcases), formulating the objective function based on these variables, and translating the constraints into algebraic expressions.

Let's define:
- \(x_1\) as the number of laptop bags produced,
- \(x_2\) as the number of briefcases produced.

The profit per laptop bag is $80, and the profit per briefcase is $50. Thus, the objective function to maximize profit (\(P\)) can be written as:
\[ P = 80x_1 + 50x_2 \]

The constraints are based on the available time for sewing and painting. For sewing, each laptop bag requires 12 minutes, and each briefcase requires 10 minutes, with a total of 300 minutes available. This constraint can be expressed as:
\[ 12x_1 + 10x_2 \leq 300 \]

For painting, each laptop bag requires 5 minutes, and each briefcase requires 9 minutes, with a total of 500 minutes available. Thus, the painting time constraint is:
\[ 5x_1 + 9x_2 \leq 500 \]

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

The symbolic representation of the problem can be summarized as follows:

```json
{
    'sym_variables': [('x1', 'laptop bags'), ('x2', 'briefcases')],
    'objective_function': '80*x1 + 50*x2',
    'constraints': ['12*x1 + 10*x2 <= 300', '5*x1 + 9*x2 <= 500', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this optimization problem using Gurobi in Python:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(name="laptop_bags", lb=0)
x2 = m.addVar(name="briefcases", lb=0)

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

# Add constraints
m.addConstr(12*x1 + 10*x2 <= 300, name="sewing_time")
m.addConstr(5*x1 + 9*x2 <= 500, name="painting_time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {x1.x}, {x2.varName} = {x2.x}")
    print(f"Maximum profit: ${m.objVal:.2f}")
else:
    print("No optimal solution found")
```