docs: def create_appointment_group(self, appointment_group_title, appointment_group_context_codes, appointment_group_description=None, appointment_group_location_address=None, appointment_group_location_name=None, appointment_group_max_appointments_per_participant=None, appointment_group_min_appointments_per_participant=None, appointment_group_new_appointments_X=None, appointment_group_participant_visibility=None, appointment_group_participants_per_appointment=None, appointment_group_publish=None, appointment_group_sub_context_codes=None):
          """
          Create an appointment group.
  
          Create and return a new appointment group. If new_appointments are
          specified, the response will return a new_appointments array (same format
          as appointments array, see "List appointment groups" action)
          """
          path = {}
          data = {}
          params = {}
  
          # REQUIRED - appointment_group[context_codes]
          """Array of context codes (courses, e.g. course_1) this group should be
          linked to (1 or more). Users in the course(s) with appropriate permissions
          will be able to sign up for this appointment group."""
          data["appointment_group[context_codes]"] = appointment_group_context_codes
  
          # OPTIONAL - appointment_group[sub_context_codes]
          """Array of sub context codes (course sections or a single group category)
          this group should be linked to. Used to limit the appointment group to
          particular sections. If a group category is specified, students will sign
          up in groups and the participant_type will be "Group" instead of "User"."""
          if appointment_group_sub_context_codes is not None:
              data["appointment_group[sub_context_codes]"] = appointment_group_sub_context_codes
  
          # REQUIRED - appointment_group[title]
          """Short title for the appointment group."""
          data["appointment_group[title]"] = appointment_group_title
  
          # OPTIONAL - appointment_group[description]
          """Longer text description of the appointment group."""
          if appointment_group_description is not None:
              data["appointment_group[description]"] = appointment_group_description
  
          # OPTIONAL - appointment_group[location_name]
          """Location name of the appointment group."""
          if appointment_group_location_name is not None:
              data["appointment_group[location_name]"] = appointment_group_location_name
  
          # OPTIONAL - appointment_group[location_address]
          """Location address."""
          if appointment_group_location_address is not None:
              data["appointment_group[location_address]"] = appointment_group_location_address
  
          # OPTIONAL - appointment_group[publish]
          """Indicates whether this appointment group should be published (i.e. made
          available for signup). Once published, an appointment group cannot be
          unpublished. Defaults to false."""
          if appointment_group_publish is not None:
              data["appointment_group[publish]"] = appointment_group_publish
  
          # OPTIONAL - appointment_group[participants_per_appointment]
          """Maximum number of participants that may register for each time slot.
          Defaults to null (no limit)."""
          if appointment_group_participants_per_appointment is not None:
              data["appointment_group[participants_per_appointment]"] = appointment_group_participants_per_appointment
  
          # OPTIONAL - appointment_group[min_appointments_per_participant]
          """Minimum number of time slots a user must register for. If not set, users
          do not need to sign up for any time slots."""
          if appointment_group_min_appointments_per_participant is not None:
              data["appointment_group[min_appointments_per_participant]"] = appointment_group_min_appointments_per_participant
  
          # OPTIONAL - appointment_group[max_appointments_per_participant]
          """Maximum number of time slots a user may register for."""
          if appointment_group_max_appointments_per_participant is not None:
              data["appointment_group[max_appointments_per_participant]"] = appointment_group_max_appointments_per_participant
  
          # OPTIONAL - appointment_group[new_appointments][X]
          """Nested array of start time/end time pairs indicating time slots for this
          appointment group. Refer to the example request."""
          if appointment_group_new_appointments_X is not None:
              data["appointment_group[new_appointments][X]"] = appointment_group_new_appointments_X
  
          # OPTIONAL - appointment_group[participant_visibility]
          """"private":: participants cannot see who has signed up for a particular
                      time slot
          "protected":: participants can see who has signed up.  Defaults to
                        "private"."""
          if appointment_group_participant_visibility is not None:
              self._validate_enum(appointment_group_participant_visibility, ["private", "protected"])
              data["appointment_group[participant_visibility]"] = appointment_group_participant_visibility
  
          self.logger.debug("POST /api/v1/appointment_groups with query params: {params} and form data: {data}".format(params=params, data=data, **path))
          return self.generic_request("POST", "/api/v1/appointment_groups".format(**path), data=data, params=params, no_data=True)