docs: def create_collection(cls, href, collection=None, props=None):
          """Create a collection.
  
          If the collection already exists and neither ``collection`` nor
          ``props`` are set, this method shouldn't do anything. Otherwise the
          existing collection must be replaced.
  
          ``collection`` is a list of vobject components.
  
          ``props`` are metadata values for the collection.
  
          ``props["tag"]`` is the type of collection (VCALENDAR or
          VADDRESSBOOK). If the key ``tag`` is missing, it is guessed from the
          collection.
  
          """
          # Path should already be sanitized
          attributes = _get_attributes_from_path(href)
          if len(attributes) <= 1:
              raise PrincipalNotAllowedError
  
          # Try to infer tag
          if not props:
              props = {}
          if not props.get("tag") and collection:
              props["tag"] = collection[0].name
  
          # Try first getting the collection if exists, or create a new one otherwise.
          try:
              self = cls(href, principal=False, tag=props.get("tag"))
          except api.exceptions.DoesNotExist:
              user_path = posixpath.join('/', cls.user)
              collection_name = hashlib.sha256(str(time.time()).encode()).hexdigest()
              sane_path = posixpath.join(user_path, collection_name)
  
              if props.get("tag") == "VCALENDAR":
                  inst = api.Calendar.create(cls.etesync, collection_name, None)
              elif props.get("tag") == "VADDRESSBOOK":
                  inst = api.AddressBook.create(cls.etesync, collection_name, None)
              else:
                  raise RuntimeError("Bad tag.")
  
              inst.save()
              self = cls(sane_path, principal=False)
  
          self.set_meta(props)
  
          if collection:
              if props.get("tag") == "VCALENDAR":
                  collection, = collection
                  items = []
                  for content in ("vevent", "vtodo", "vjournal"):
                      items.extend(
                          getattr(collection, "%s_list" % content, []))
                  items_by_uid = groupby(sorted(items, key=get_uid), get_uid)
                  vobject_items = {}
                  for uid, items in items_by_uid:
                      new_collection = vobject.iCalendar()
                      for item in items:
                          new_collection.add(item)
                      href = self._find_available_file_name(
                          vobject_items.get)
                      vobject_items[href] = new_collection
                  self.upload_all_nonatomic(vobject_items)
              elif props.get("tag") == "VADDRESSBOOK":
                  vobject_items = {}
                  for card in collection:
                      href = self._find_available_file_name(
                          vobject_items.get)
                      vobject_items[href] = card
                  self.upload_all_nonatomic(vobject_items)
  
          return self