Repository: dask-contrib/dask-expr (python)

Issue:
Missing parameter in `AssignAlign`
As mentioned [here](https://github.com/dask-contrib/dask-expr/pull/857/files#r1484688097), #857 introduced a small regression for a certain combination of assign + project. E.g.

```python
import pandas as pd
import dask_expr as dd

pdf = pd.DataFrame({"x": [0] * 20, "y": range(20)})
df = dd.from_pandas(pdf, npartitions=2)
s = pd.Series(range(10, 30))
ds = dd.from_pandas(s, npartitions=df.npartitions)
got = df.assign(z=ds)[["y", "z"]]
got.compute()  # Produces an error
```
```
AttributeError: 'AssignAlign' object has no attribute 'keys'
```

Pull request description:
Fix assign projections for alignment
closes #864

bandaid to get out fast, will work on a proper fix tomorrow probably

Patch:
diff --git a/dask_expr/_expr.py b/dask_expr/_expr.py
index 5a03c72..0ec24db 100644
--- a/dask_expr/_expr.py
+++ b/dask_expr/_expr.py
@@ -3200,19 +3200,14 @@ class AssignAlign(MaybeAlignPartitions):
             if not isinstance(columns, list):
                 columns = [columns]
 
-            cols = set(columns) - set(self.keys)
+            cols = set(columns) - {self.column}
             if cols == set(self.frame.columns):
                 # Protect against pushing the same projection twice
                 return
 
-            diff = set(self.keys) - set(columns)
-            if len(diff) == len(self.keys):
+            diff = {self.column} - set(columns)
+            if len(diff) == 1:
                 return type(parent)(self.frame, *parent.operands[1:])
-            elif len(diff) > 0:
-                new_args = []
-                for k, v in zip(self.keys, self.vals):
-                    if k in columns:
-                        new_args.extend([k, v])
             else:
                 new_args = self.operands[1:]
 


Test patch:
diff --git a/dask_expr/tests/test_align_partitions.py b/dask_expr/tests/test_align_partitions.py
index 00f2911..a9c8bf3 100644
--- a/dask_expr/tests/test_align_partitions.py
+++ b/dask_expr/tests/test_align_partitions.py
@@ -97,3 +97,13 @@ def test_series_map(sorted_index, sorted_map_index):
     dask_map = from_pandas(mapper, npartitions=1, sort=False)
     result = dask_base.map(dask_map)
     assert_eq(expected, result)
+
+
+def test_assign_align_partitions():
+    pdf = pd.DataFrame({"x": [0] * 20, "y": range(20)})
+    df = from_pandas(pdf, npartitions=2)
+    s = pd.Series(range(10, 30))
+    ds = from_pandas(s, npartitions=df.npartitions)
+    result = df.assign(z=ds)[["y", "z"]]
+    expected = pdf.assign(z=s)[["y", "z"]]
+    assert_eq(result, expected)