To solve this optimization problem, we first need to define the decision variables and the constraints based on the given information.

Let's denote:
- $x$ as the number of kilograms of basmati rice produced.
- $y$ as the number of kilograms of bananas produced.

The objective is to maximize profit. The net profit per kilogram of basmati rice is $15, and for bananas, it is $28. Therefore, the total profit can be represented as $15x + 28y$.

Now, let's consider the constraints:
1. Human labor: To produce one kilogram of basmati rice requires 1.5 hours of human labor, and for bananas, it requires 2 hours. The factory has 90 hours of human labor available. So, the constraint is $1.5x + 2y \leq 90$.
2. Machine work: One kilogram of basmati rice requires 2 hours of machine work, and one kilogram of bananas requires 4 hours. With 150 hours of machine labor available, the constraint is $2x + 4y \leq 150$.
3. Time under the sun: Basmati rice requires 3 hours, and bananas require 1.5 hours per kilogram. Given 70 hours are available, the constraint is $3x + 1.5y \leq 70$.

Non-negativity constraints also apply since the factory cannot produce a negative amount of either product: $x \geq 0$, $y \geq 0$.

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

```python
from gurobipy import *

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

# Define the decision variables
x = m.addVar(lb=0, name="basmati_rice")
y = m.addVar(lb=0, name="bananas")

# Set the objective function: maximize profit
m.setObjective(15*x + 28*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(1.5*x + 2*y <= 90, "human_labor")
m.addConstr(2*x + 4*y <= 150, "machine_work")
m.addConstr(3*x + 1.5*y <= 70, "time_under_sun")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Basmati Rice: {x.x} kg")
    print(f"Bananas: {y.x} kg")
    print(f"Total Profit: ${15*x.x + 28*y.x}")
else:
    print("No optimal solution found.")
```