True only when endsAt is set and already in the past. A poll with no endsAt never ends.
bool get hasEnded => endsAt != null && endsAt!.toUtc().isBefore(DateTime.now().toUtc());